You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改说明

  1. 把char ch改成int ch:确保能正确接收getchar()返回的EOF值,避免循环无法终止的问题。
  2. 用fputc(ch, ptr)写入文件:这才是往你打开的test.txt里写字符的正确函数,替代原来只输出到控制台的putchar。
  3. 添加fopen失败检查:避免文件打开失败时的未定义行为,同时给用户明确的错误提示。
  4. 调整循环逻辑:用while循环替代do-while,这样不会把EOF写入文件(原来的do-while会先执行一次写入,把EOF也写进去,虽然EOF是控制字符,但没必要)。
  5. 修正main函数的返回类型:符合C语言标准,保证程序可移植性。

现在运行这个修正后的程序,输入内容后按Ctrl+Z,你会发现test.txt里正确保存了你输入的所有内容啦!

内容的提问来源于stack exchange,提问作者Mau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:02:20