2012-10-28 44 views
1

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

回答

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"); 
+0

我添加了这些行: chdir(argv [0]); outstream out(“Summary.txt”); ; 但它没有帮助 - 文件Summary.txt仍然出现在用户文件夹 – Yashman

+0

chdir(argv [0])将始终失败,因为argv [0]是您的二进制文件的路径而不是目录的路径,您需要首先去除文件名部分。 – mauve

+0

更新的答案可以更好地解释我的意图。 – LSerni

1

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

1

当您打开一个文件,根据其文件名或文件被打开或相对于当前工作目录中创建一个相对路径的方式。看起来,当你从XCode运行时,工作目录被设置为创建二进制文件的目录,而Finder在启动新进程时将当前工作目录设置为主目录。

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