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