为什么 Fread 只能处理某些文件?

问题描述 投票:0回答:1

我已经开始摆弄 C 中的 Fread/Fwrite 函数。我基本上正在开发一个程序,该程序可以为我的月末会计任务操作 CSV 文件上的数据。 对于我的 CSV 文件,Fread 函数似乎(通常)可以正常工作。 我可以有效地将 CSV 文件传输到屏幕等。偶尔,我会在数据 fread()!=counted/buffered item 的某些字节上收到读取错误,并抛出错误。

出于好奇,我在非 csv 文件(特别是 png 文件)上运行了我的程序。 该文件似乎在我的程序上正确运行。 我可以看出情况就是如此,因为我的程序的运行方式与 CSV 文件的运行方式相同。 我已经设置了文件来告诉我我创建的另一个函数中的统计信息(字符大小)等。 我还设置了一个程序来告诉我文件的字母/字符数(a 到 z)。 当我运行图片文件时,程序似乎通常会填充上面的静态详细信息;然而,当我尝试查看流时,除了 png 和问号之外什么也没有显示。 我本以为至少会出现大量垃圾,但我什么也没得到。 尽管上述统计数据似乎已显示,但为什么流没有显示任何内容? 我想知道它是否与缓冲区或某种内部操作系统有关。

c image png fread
1个回答
0
投票

简单来说,

fread()
最适合二进制数据。 CSV 文件不是二进制数据,因此
fread()
通常不合适。

这确实取决于您将如何处理您读取的数据。 如果您只是将其复制到标准输出(终端),可能没问题。

如果您对文件的最后一个块进行了部分读取,这不是一个错误 - 这是现实跳跃并让您知道文件大小不是您用于读取文件的块大小的倍数数据。 打印已读取的数据,通常无需尝试读取更多数据。 您可以等到从

fread()
返回零后再停止(所以再试一次)。 例如,如果输入来自管道,这可能是合适的。

谨慎选择输出机制。 如果使用

fread()
读取数据并且您不修改它,则使用
fwrite()
可能比较合适。 否则,请注意数据中的空字节 - 特别是当输入不是文本时。

© www.soinside.com 2019 - 2024. All rights reserved.