c ++中的image子目录

时间:2009-05-03 02:31:39

标签: c++ image

基本上,我希望保持我的文件排序而不是将它们全部放在与我的可执行文件相同的文件夹中,但是相对于我的可执行文件引用子文件夹中的文件已经证明是困难的。

// DEFINES
#define IMAGE_BACKGROUND "\\content\\images\\background.bmp"
#define FONT_MAIN "\\content\\fonts\\sai.ttf"

上面的代码显然不起作用。 我认为args [0]在某种程度上是我的路径?有人想再详细说明一下吗?

int main(int argc, char* args[])
{

6 个答案:

答案 0 :(得分:1)

我应该提到Boost.Filesystem是一个很好的图书馆,可以帮助你。

答案 1 :(得分:0)

args [0]是完整路径名(嗯,但这也是由操作系统和shell决定的,所以你可能得到一个未完整的短文件名)到你的“可执行文件”,而不是它的文件夹。你必须截断它。

尝试使用splitpath和joinpath。

答案 2 :(得分:0)

args[0]是用于调用可执行文件的名称,它不一定是可执行文件的完整路径。您对可执行文件的工作目录感兴趣,这是依赖于操作系统的。

无论如何,你必须小心相对路径。如果您的用户从不同的目录调用您的程序,您的工作目录可能会出现意外情况,并且您将无法正确引用您的文件。

由于您使用的是Windows,因此可以使用GetModuleFileName函数(请参阅documentation)获取可执行文件的全名,如下所示:

GetModuleFileName(NULL, buffer, length);

答案 3 :(得分:0)

你有没有尝试过:

#define IMAGE_BACKGROUND "\content\images\background.bmp"

这可能是问题(因为我之前使用过子文件夹中的图像)

答案 4 :(得分:0)

此代码应该有效:

#define IMAGE_BACKGROUND "\\content\\images\\background.bmp"

int main(int argc, char* args[])
{

    char buf[512];
    int endOfPath = strrchr(args[0], '\\') - args[0];
    strncpy_s(buf, sizeof(buf), args[0], endOfPath);
    strcat(buf, IMAGE_BACKGROUND);

就像其他人说的那样,args [0]是执行的完整路径,所以你不能按原样使用它。 strrchr函数(中间的两个r)查找给定字符的最后一次出现并返回指向它的指针。假设您使用的是单字节字符,从返回的指针中减去args [0]将为您提供两个指针之间的字符数 - 当您减去两个指针时,实际上减去了内存地址,那么你是什么left with是指针之间的偏移量或距离。此距离类似于找到的字符的索引。

然后我使用strncpy_s函数将args [0]中的endOfPath字符数复制到临时缓冲区。现在,如果你的程序路径是
“C:\ Windows \ Users \ Me \ Desktop \ myProgram \ theProgram.exe”
buf变量将包含
“C:\ Windows \ Users \ Me \ Desktop \ myProgram”

然后我使用strcat(conCATenation)函数将你的常量追加到最后。

请注意,使用#define时,“\\”在C / C ++中是必需的,并且还注意到“标记将包含在使用IMAGE_BACKGROUND的位置。

在这些代码行之后,buf将包含:
“C:\的Windows \用户\我\桌面\ myProgram \内容\图像\ background.bmp”

希望有所帮助,而不是太混乱......

答案 5 :(得分:0)

我实际上是通过使用以下代码解决了它,谢谢大家的回复:

// DEFINES
#define IMAGE_BACKGROUND ".\\content\\images\\background.png"
#define IMAGE_BLUEBLOCK ".\\content\\images\\blueblock.png"
#define FONT_MAIN ".\\content\\fonts\\sai.ttf"

原来的。获取“工作路径目录”。