我有一个奇怪的问题,我需要帮助。我制作了一个C++程序,它从.txt文件获取一些数据,并将一些数据写入另一个.txt文件。当我通过Xcode编译和运行程序时,它会将输出文件与程序文件放在同一目录中 - 这正是我需要的。但是当我关闭Xcode并通过双击运行程序时,它会在我的用户目录中创建一个输出文件。有没有办法来解决这个问题?输出文本文件的位置
1
A
回答
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");
1
我不确定我完全理解了这个问题 - 但我认为你只需要提供一个完整的文件名(包括路径)到你的输出文件。
1
当您打开一个文件,根据其文件名或文件被打开或相对于当前工作目录中创建一个相对路径的方式。看起来,当你从XCode运行时,工作目录被设置为创建二进制文件的目录,而Finder在启动新进程时将当前工作目录设置为主目录。
您可以绝对指定路径(以斜杠开始),也可以结合getcwd()
的结果和argv[0]
中指定的路径计算二进制位置。 argv[0]
包含您的二进制文件相对于当前工作目录的位置,因此它可以用来计算二进制文件的位置作为绝对路径。
相关问题
- 1. 输出.jar文件的位置
- 2. logstash文本文件输出配置
- 3. 用于输入和输出文件夹位置的配置文件
- 4. 输出文本文件
- 5. 输出到文本文件
- 6. 骆驼文件组件中的动态输入/输出文件夹位置
- 7. 文本输出放置
- 8. 输入和输出文本文件
- 9. 将输出文件保存在与输入文件不同的位置
- 10. 文本文件后位置的tomcat deployement
- 11. 的UITextField输入文本位置
- 12. 通过FileOutputStream输出的文本文件
- 13. 输出到Java中的文本文件
- 14. Java/JSP的输出文本文件
- 15. 输出到lisp中的文本文件
- 16. Biztalk的文本文件输出?
- 17. 标签位置正确的节点的XSLT输出文本()
- 18. Java;从输入文本文件到输出文本文件的换行符
- 19. 设置python脚本的输出位置
- 20. 位置C#位置文本
- 21. 文本位置
- 22. IExpress输出文件版本
- 23. 在文本中的光标位置插入文本输入
- 24. 将sqoop的输出导出到本地的文本文件中
- 25. 配置文件位置模块 - 输出完整国名
- 26. 输出文本
- 27. 输出文本
- 28. Hadoop作业输入文件的位置
- 29. C#文本文件输入多文件输出
- 30. 读取输入文件,插入文本输出文件
我添加了这些行: chdir(argv [0]); outstream out(“Summary.txt”); ; 但它没有帮助 - 文件Summary.txt仍然出现在用户文件夹 – Yashman
chdir(argv [0])将始终失败,因为argv [0]是您的二进制文件的路径而不是目录的路径,您需要首先去除文件名部分。 – mauve
更新的答案可以更好地解释我的意图。 – LSerni