输出文本文件的位置

时间:2012-10-28 16:34:08

标签: c++ xcode file output

我遇到了一个我需要帮助的奇怪问题。我做了一个C ++程序,从.txt文件中获取一些数据,并将一些数据写入另一个.txt文件。当我通过Xcode编译并运行程序时,它使输出文件与程序文件位于同一目录中 - 这正是我所需要的。但是当我关闭Xcode并通过双击它来运行程序时,它会在我的Users目录中创建一个输出文件。有办法解决这个问题吗?

3 个答案:

答案 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");