Notepad++运行含文件操作C程序时生成文件缺失问题排查
编写了一段包含文件操作逻辑的C语言程序,实现读取用户输入、将小写字母转换为大写后写入text.txt文件的功能,完整代码如下:
#include <stdio.h> int main() { FILE *fp; fp = fopen("text.txt", "w"); char c; while ((c = getchar()) != '!') { if (c >= 'a' && c <= 'z') c -= 32; fputc(c, fp); } fclose(fp); return 0; }
实际测试存在如下现象:
- 直接通过命令行运行、或双击编译生成的exe可执行文件时,程序运行正常,可生成目标
text.txt文件 - 使用Notepad++的运行功能,填入运行命令
cmd /k $(CURRENT_DIRECTORY)\$(NAME_PART).exe $(FULL_CURRENT_PATH & PAUSE & EXIT执行程序时,程序可正常编译,但运行结束后无法找到生成的text.txt文件
核心问题是相对路径的工作目录不匹配:
代码中fopen("text.txt", "w")使用的是相对路径,这种写法生成的文件会存放在程序启动时的当前工作目录下,而非exe文件自身所在的目录。
通过命令行手动运行、双击exe运行时,系统会自动把exe所在目录设置为当前工作目录,所以文件会生成在预期位置;但通过Notepad的运行功能启动程序时,Notepad默认的工作目录是自身的安装目录(或其他全局配置的工作路径),并非exe所在的源码目录,因此生成的text.txt实际被存到了Notepad++的安装路径下,你在源码目录查找自然找不到。
另外你填写的运行命令还存在语法错误:$(FULL_CURRENT_PATH变量缺少闭合的右括号,不过该问题不会导致文件生成位置异常。
优先选择修改Notepad++运行命令的方案,无需调整原有代码:
将原运行命令替换为以下内容,执行前先切换到源码所在目录,再启动程序:
cmd /k cd /d "$(CURRENT_DIRECTORY)" && "$(NAME_PART).exe" & PAUSE & EXIT
命令中cd /d的作用是强制切换到目标目录(跨盘符也可正常生效),保证程序启动时的工作目录和exe所在目录一致,此时相对路径生成的text.txt就会出现在预期的源码目录中。
如果需要找回之前运行生成的文件,直接打开Notepad++的安装目录(通常为C:\Program Files\Notepad++或C:\Program Files (x86)\Notepad++)即可找到之前生成的text.txt。
内容的提问来源于stack exchange,提问作者freshman

