【问题标题】:fread/fwrite size and count [duplicate]fread/fwrite 大小和计数 [重复]
【发布时间】:2013-10-16 17:46:00
【问题描述】:

我对用于 fread/fwrite 的参数大小和计数的顺序有疑问。如果我想从文件fp中读取8kb的数据,下面哪个效率更高?

fread(data,1,8192,fp)
fread(data,8192,1,fp)

还有我应该担心的字节序问题吗?

【问题讨论】:

    标签: c++ c file endianness


    【解决方案1】:

    它们是完全等价的。至于字节顺序,这取决于你在读什么。通常,它将是一个字节缓冲区,然后您必须根据写入它们的格式“取消格式化”。而且由于它是字节,所以字节序没有任何作用。

    编辑:

    正如 simonc 指出的那样(然后删除,因为他没有 100% 正确理解它——但他的观点是有效的):返回值存在差异(您需要按顺序使用知道该功能是否有效)。 fread( buffer, 8192, 1, fp ) 将返回 0 或 1,并且只有在读取了所有 8192 个字节后才返回 1。此外,Posix 说缓冲区的内容没有为部分读取的对象指定。实际上,缓冲区将填充尽可能多的字节,但由于您不知道那是多少,这对您来说并没有什么好处。总而言之,您应该始终使用fread( buffer, 1, 8192, fp );(因为除了字节缓冲区之外,将此函数用于其他任何内容都没有任何意义)。

    【讨论】:

    • 好吧,既然是字节,显然字节序会起到一些作用。想象一下,他正试图将这 8kb 的数据读入一个具有 int 成员的结构中,例如。你假设他正在尝试做类似char string[] = fread(data,8192,1,fp);
    • @fvdalcin 他正在读取字节。字节没有字节序。一旦他阅读了它们,他必须根据文件格式的规范来解释它们。这通常应该在不考虑字节顺序的情况下完成。
    • @fvdalcin 是的,这些函数的唯一合理使用是unsigned char buffer[8192]; fread( buffer, 8192, 1, fp );。然后,您必须根据指定的文件格式解释缓冲区。
    • 谢谢。它们是否同样有效?
    • @James Kanze 请注意:fread() 可用于磁盘以外的 I/O 和 stdin,如从串行 I/O 读取部分 8192 块。
    【解决方案2】:

    它们并不完全等价。

    fread() 设计错误。它的设计忽略了在文件末尾部分读取的可能性,它不能用它的返回值来表示,它以你指定的大小为单位。

    你真的应该只使用fread(),其中大小为 1,长度是你期望的字节数。只有这样,你才能妥善处理这种情况。对于char 以外的类型,这意味着提供sizeof char 作为大小,n*sizeof T 作为长度,其中n 是您期望的Ts 的数量。

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2020-12-14
      • 1970-01-01
      相关资源
      最近更新 更多