fread / fwrite大小和计数

时间:2013-10-16 17:46:01

标签: c++ c file endianness

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

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

还有我应该担心的endiannes问题吗?

2 个答案:

答案 0 :(得分:11)

他们完全相同。至于字节序,它取决于你正在阅读的内容。通常情况下,它将是一个字节缓冲区,根据它们的格式,您必须“取消格式化”。由于它是字节,因此字节顺序不起作用。

编辑:

正如simonc指出的那样(然后删除,因为他没有100%正确 - 但他的观点是有效的):关于返回值(你需要按顺序使用)有所不同知道功能是否有效)。只有在读取了所有8192个字节时,fread( buffer, 8192, 1, fp )才会返回0或1和1。此外,Posix说没有为部分读取的对象指定缓冲区的内容。在实践中,缓冲区将填充尽可能多的字节,但由于你不知道有多少字节,这对你来说并不多。总之,你应该总是使用fread( buffer, 1, 8192, fp );(因为除了字节缓冲区之外的任何东西使用这个函数是没有意义的。)

答案 1 :(得分:2)

他们并不完全等同。

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

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