1

我有一个奇怪的问题需要帮助。我制作了一个 C++ 程序,它从 .txt 文件中获取一些数据并将一些数据写入另一个 .txt 文件。当我通过 Xcode 编译和运行程序时,它会将输出文件与程序文件放在同一目录中——这正是我所需要的。但是当我关闭 Xcode 并通过双击运行程序时,它会在我的用户目录中创建一个输出文件。有没有办法解决这个问题?

4

3 回答 3

1

我不确定我是否完全理解了这个问题 - 但我认为您只需要为输出文件提供完整的文件名(包括路径)。

于 2012-10-28T16:39:16.183 回答
1

当您根据文件名或通过相对路径打开文件时,该文件将相对于您当前的工作目录打开或创建。似乎当您从 XCode 运行时,工作目录设置为创建二进制文件的目录,而 Finder 在启动新进程时将当前工作目录设置为您的主目录。

您可以绝对指定路径(以斜杠开头),也可以通过将 的结果getcwd()argv[0]. argv[0]包含二进制文件相对于当前工作目录的位置,因此它可用于将二进制文件的位置计算为绝对路径。

于 2012-10-28T16:48:00.927 回答
0

您可以使用它argv[0]来检索程序的完整路径。

然后,要么chdir到该路径,要么使用从第一个路径构建的完整路径打开目标文件。

例如:

char path_buffer[512];

strncpy(path_buffer, argv[0], 512); // This might be /home/user/Desktop/binary.exe

chdir(dirname(path_buffer));    // This is now /home/user/Desktop

fp = fopen("myfile.txt", "w");

“盲目”chdir进入任何dirname返回是安全的,因为dirname将返回“。” (当前目录)以防出错。

或者还有:

char path_buffer[512];
char new_buffer[512];

strncpy(path_buffer, argv[0], 512); // This might be /home/user/Desktop/binary.exe

snprintf(new_buffer, 512, "%s/%s", dirname(path_buffer), "myfile.txt");
fp = fopen(new_buffer, "w");

以上将设置为在可执行文件的同一目录中new_buffer调用的文件的完整路径名。myfile.txt我们需要两个缓冲区,因为dirname可能会返回一个指向静态存储的指针,并且将“myfile.txt”直接附加到返回的字符串指针是不安全的,因为它相信它是path_buffer.

path_buffer无需借助.就可以进行编辑dirname。这会导致可移植性问题,因为目录分隔符不一定是“/”;它可能是“\”。

char path_buffer[512];
char *p, *q;
strncpy(path_buffer, argv[0], 512);
for (p = q = path_buffer; *p; p++)
    if (('/' == *p) || ('\\' == *p))
        q = p+1;
strncpy(q, "myfile.txt", 512 - (q - path_buffer));
// You may now use path_buffer as file name:
fp = fopen(path_buffer, "w");
于 2012-10-28T16:42:38.760 回答