C++ 输出文本文件的位置

C++ 输出文本文件的位置,c++,xcode,file,output,C++,Xcode,File,Output,我有一个奇怪的问题需要帮助。我已经制作了一个C++程序,从.txt文件中获取一些数据,并将一些数据写入另一个.txt文件。当我使用Xcode编译和运行程序时,它会使输出文件与程序文件位于同一目录中——这正是我所需要的。但当我关闭Xcode并通过双击运行程序时,它会在我的用户目录中创建一个输出文件。有没有办法解决这个问题?我不确定我是否完全理解了这个问题-但我认为您只需要为输出文件提供完整的文件名(包括路径)。您可以使用argv[0]检索程序的完整路径 然后,将chdir添加到该路径,或者使用从第

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

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

您可以使用
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\u buffer
设置为可执行文件的同一目录中名为
myfile.txt
的文件的完整路径名。我们需要两个缓冲区,因为
dirname
可能会返回一个指向静态存储的指针,而直接将“myfile.txt”附加到返回的字符串指针上是不安全的,因为它是
path\u buffer
的修改版本

可以编辑
path\u buffer
,而无需诉诸
dirname
。这会导致可移植性问题,因为目录分隔符不一定是“/”;它可能是“\”


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


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

I添加了以下行:chdir(argv[0]);流式输出(“Summary.txt”);但是它没有帮助-Summary.txt文件仍然出现在用户文件夹中(argv[0])将始终失败,因为argv[0]是二进制文件的路径,而不是目录的路径,您需要先去掉文件名部分。更新的答案可以更好地解释我的意图。非常感谢,这非常有效!但函数strncpy必须如下所示:strncpy(path_buffer,argv[0],512),首先到达目的地,然后是要复制的C字符串,然后是要复制的最大字符数。顺便说一句,为什么不只用strcpy呢?谢谢你的通知,我把我的函数原型搞混了。最好使用“n”函数(sNprintf、strNcpy),因为这样可以确保在太小的缓冲区中不会写入太多内容。。。“那太糟糕了”。
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");