You need to enable JavaScript to run this app. C语言先调用fgetc后调用fscanf结果不一致问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

C语言先调用fgetc后调用fscanf结果不一致问题咨询

问题原因

每个通过fopen打开的FILE类型指针都会关联一个文件位置指示器,用来标记当前读写操作在文件中的偏移位置。
你调用fgetc循环遍历文件直到返回EOF的过程中,这个指示器已经被逐步移动到了文件的末尾。如果此时不重置位置直接调用fscanf,所有读取操作都会直接从文件末尾开始执行,读取不到任何有效数值,数组arr的元素会是栈上的随机垃圾值,最终计算结果自然和预期不符。
你现在选择重新打开文件的操作本质上就是获取了一个位置指示器在开头的新文件句柄,所以能得到正确结果,但这个写法存在资源泄漏的问题:第一次打开的文件句柄在被重新赋值前没有调用fclose关闭,会占用系统资源直到进程退出。

解决方法

两种方案可选,优先选第一种:

  • 无需重新打开文件,在计数逻辑结束后直接调用rewind(myFile),即可把文件位置指示器重置到文件开头,后续fscanf就可以正常读取数据,还避免了资源泄漏。也可以用fseek(myFile, 0, SEEK_SET)实现完全相同的效果。
  • 如果要保留重新打开文件的逻辑,需要在第二次调用fopen之前先执行fclose(myFile)关闭第一次打开的文件句柄。
额外代码问题说明

你贴出的代码还有两处明显的语法问题需要修正才能正常编译运行:

  • mean = arr[0]末尾缺少分号
  • 两处printf里的换行符写法有误,需要把代码里的换行替换成标准的\n

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:30:03