我怀疑用于fread / fwrite的参数大小和计数的顺序。如果我想从文件fp中读取8kb的数据,以下哪项更有效?
fread(data,1,8192,fp)
fread(data,8192,1,fp)
还有我应该担心的endiannes问题吗?
答案 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
的数量。