fread / fwrite大小和计数
我怀疑用于fread / fwrite的参数大小和计数的顺序。 如果我想从文件fp中读取8kb数据,以下哪项更有效?
fread(data,1,8192,fp) fread(data,8192,1,fp)
还有我应该担心的endiannes问题吗?
它们完全相同。 至于字节序,它取决于你正在阅读什么。 通常情况下,它将是一个字节缓冲区,根据它们的格式,您必须“取消格式化”。 由于它是字节,因此字节顺序不起作用。
编辑:
正如simonc指出的那样(然后删除,因为他没有100%正确 – 但他的观点是有效的):关于返回值(你需要使用它以了解是否有效)function是否有效)。 fread( buffer, 8192, 1, fp )
将返回0或1,并且只有在读取了所有8192个字节时才返回1。 此外,Posix说没有为部分读取的对象指定缓冲区的内容。 在实践中,缓冲区将填充尽可能多的字节,但由于你不知道有多少字节,这对你来说并不多。 总之,你应该总是使用fread( buffer, 1, 8192, fp );
(因为将此函数用于除字节缓冲区之外的任何内容都没有意义)。
它们并不完全等同。
fread()
设计错误。 它的设计忽略了文件末尾部分读取的可能性,它不能用其返回值表示,返回值以您指定的大小为单位。
你应该只使用大小为1的fread()
,长度是你期望的字节数。 这是你能够妥善处理这种情况的唯一方法。 对于char
以外的类型,这意味着将sizeof char
作为大小,将n*sizeof T
作为长度,其中n
是您期望的T
s的数量。