C语言使用fscanf读取文件输出错误原因及文件操作相关疑问解答
问题解答
问题1:将文件存储的数据打印到输出屏幕前,是否必须先使用fscanf函数读取内容?
不需要。fscanf仅适用于格式化读取文本文件的场景,你也可以根据需求选择其他文件读取函数:
- 按行读取可以用
fgets - 按单个字符读取可以用
fgetc - 读取二进制内容可以用
fread
只要把磁盘上的文件内容读取到程序内存的变量中,就可以打印输出,不强制要求使用fscanf。
问题2:输出结果为Ramusa1212的原因
该问题是写入文件时无分隔符+读取格式化匹配失败共同导致的,具体逻辑如下:
- 写入阶段的内容构造:
- 你用
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
- 你用
- 读取阶段的匹配错误:
- 用
fscanf(fptr,"%s%s%d",name,address,&roll)读取文件时,%s默认匹配到空白字符就停止:- 第一个
%s匹配到Ram,碰到换行符\n停止,存入name数组 - 第二个
%s跳过换行符后,后续所有非空白内容usa12都会被匹配到,存入address数组 - 此时文件内容已经被读完,第三个
%d匹配失败,roll变量的值不会被修改,仍然保留之前输入的12
- 第一个
- 用
- 最终打印时,输出
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
相关产品推荐
相关产品推荐

