C语言键盘输入写文件程序生成的文件为空无字符问题咨询
问题排查与修正
首先,你的程序生成空文件的核心原因很明显:你打开了文件,但从头到尾都没往文件里写任何数据!你用的putchar(ch)是把字符输出到控制台,而不是写入你打开的test.txt。另外还有几个隐藏的小问题会导致程序行为异常,我一一给你拆解:
具体问题分析
- 未使用文件指针写入数据:你成功打开了
test.txt,但变量ptr完全没被用到,所有输入的字符都只打印到了控制台,根本没写到文件里。 - 字符类型不匹配:
getchar()返回的是int类型(因为要容纳EOF这个特殊值,它的数值是-1),而你把ch定义成了char。如果你的编译器把char当作无符号类型,那么EOF会被转换成255,导致循环永远无法终止,还会把错误的字符写入文件。 - 未检查文件打开是否成功:如果因为权限问题或者路径错误导致
fopen失败,ptr会变成NULL,后续操作会触发未定义行为。 main函数不符合标准:C标准规定main函数的返回类型必须是int,void main是非标准写法,在某些环境下可能出问题。
修正后的代码
#include<stdio.h> int main() { FILE *ptr; int ch; // 改成int类型,正确接收getchar的返回值 // 打开文件并检查是否成功 ptr = fopen("test.txt", "w"); if (ptr == NULL) { printf("无法打开文件!\n"); return 1; // 返回非0值表示程序异常退出 } printf("请输入内容,按Ctrl+Z结束输入:\n"); // 先读取字符,判断不是EOF再处理,避免写入EOF while ((ch = getchar()) != EOF) { fputc(ch, ptr); // 写入到文件 putchar(ch); // 可选:在控制台回显输入的字符 } fclose(ptr); // 关闭文件,确保缓冲区数据写入磁盘 return 0; }
关键修改说明
- 把
char ch改成int ch:确保能正确接收getchar()返回的EOF值,避免循环无法终止的问题。 - 用
fputc(ch, ptr)写入文件:这才是往你打开的test.txt里写字符的正确函数,替代原来只输出到控制台的putchar。 - 添加
fopen失败检查:避免文件打开失败时的未定义行为,同时给用户明确的错误提示。 - 调整循环逻辑:用
while循环替代do-while,这样不会把EOF写入文件(原来的do-while会先执行一次写入,把EOF也写进去,虽然EOF是控制字符,但没必要)。 - 修正
main函数的返回类型:符合C语言标准,保证程序可移植性。
现在运行这个修正后的程序,输入内容后按Ctrl+Z,你会发现test.txt里正确保存了你输入的所有内容啦!
内容的提问来源于stack exchange,提问作者Mau
相关产品推荐
相关产品推荐

