我有一个奇怪的问题需要帮助。我制作了一个 C++ 程序,它从 .txt 文件中获取一些数据并将一些数据写入另一个 .txt 文件。当我通过 Xcode 编译和运行程序时,它会将输出文件与程序文件放在同一目录中——这正是我所需要的。但是当我关闭 Xcode 并通过双击运行程序时,它会在我的用户目录中创建一个输出文件。有没有办法解决这个问题?
3 回答
我不确定我是否完全理解了这个问题 - 但我认为您只需要为输出文件提供完整的文件名(包括路径)。
当您根据文件名或通过相对路径打开文件时,该文件将相对于您当前的工作目录打开或创建。似乎当您从 XCode 运行时,工作目录设置为创建二进制文件的目录,而 Finder 在启动新进程时将当前工作目录设置为您的主目录。
您可以绝对指定路径(以斜杠开头),也可以通过将 的结果getcwd()
和argv[0]
. argv[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");