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

C语言使用fscanf读取文件输出错误原因及文件操作相关疑问解答

问题解答

问题1:将文件存储的数据打印到输出屏幕前,是否必须先使用fscanf函数读取内容?

不需要。fscanf仅适用于格式化读取文本文件的场景,你也可以根据需求选择其他文件读取函数:

  • 按行读取可以用fgets
  • 按单个字符读取可以用fgetc
  • 读取二进制内容可以用fread
    只要把磁盘上的文件内容读取到程序内存的变量中,就可以打印输出,不强制要求使用fscanf。

问题2:输出结果为Ramusa1212的原因

该问题是写入文件时无分隔符+读取格式化匹配失败共同导致的,具体逻辑如下:

  1. 写入阶段的内容构造:
    • 你用fgets(name,20,stdin)读取输入的Ram时,会把输入末尾的换行符\n一起存入name数组,此时name的内容为Ram\n\0
    • 后续用scanf("%s",address)读取到usa,scanf("%d",&roll)读取到12
    • 你用fprintf(fptr,"%s%s%d",name,address,roll)写入文件时,没有加任何分隔符,最终写入文件的内容为Ram\nusa12
  2. 读取阶段的匹配错误:
    • 用fscanf(fptr,"%s%s%d",name,address,&roll)读取文件时,%s默认匹配到空白字符就停止:
      • 第一个%s匹配到Ram,碰到换行符\n停止,存入name数组
      • 第二个%s跳过换行符后,后续所有非空白内容usa12都会被匹配到,存入address数组
      • 此时文件内容已经被读完,第三个%d匹配失败,roll变量的值不会被修改,仍然保留之前输入的12
  3. 最终打印时,输出name(Ram)+address(usa12)+roll(12),拼接结果就是Ramusa1212

修复建议

  • 写入文件时在不同字段之间加分隔符(比如空格、换行),修改fprintf语句为fprintf(fptr,"%s %s %d",name,address,roll);
  • 读取完成后检查fscanf的返回值,确认匹配成功的字段数,避免使用未成功读取的变量
  • 修正代码中其他不规范写法:exit是函数,需改为exit(-1);void main不符合C标准,建议改为int main(void),结尾加return 0;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:06