【发布时间】:2013-10-16 17:46:00
【问题描述】:
我对用于 fread/fwrite 的参数大小和计数的顺序有疑问。如果我想从文件fp中读取8kb的数据,下面哪个效率更高?
fread(data,1,8192,fp)
fread(data,8192,1,fp)
还有我应该担心的字节序问题吗?
【问题讨论】:
标签: c++ c file endianness
我对用于 fread/fwrite 的参数大小和计数的顺序有疑问。如果我想从文件fp中读取8kb的数据,下面哪个效率更高?
fread(data,1,8192,fp)
fread(data,8192,1,fp)
还有我应该担心的字节序问题吗?
【问题讨论】:
标签: c++ c file endianness
它们是完全等价的。至于字节顺序,这取决于你在读什么。通常,它将是一个字节缓冲区,然后您必须根据写入它们的格式“取消格式化”。而且由于它是字节,所以字节序没有任何作用。
编辑:
正如 simonc 指出的那样(然后删除,因为他没有 100% 正确理解它——但他的观点是有效的):返回值存在差异(您需要按顺序使用知道该功能是否有效)。 fread( buffer, 8192, 1, fp ) 将返回 0 或 1,并且只有在读取了所有 8192 个字节后才返回 1。此外,Posix 说缓冲区的内容没有为部分读取的对象指定。实际上,缓冲区将填充尽可能多的字节,但由于您不知道那是多少,这对您来说并没有什么好处。总而言之,您应该始终使用fread( buffer, 1, 8192, fp );(因为除了字节缓冲区之外,将此函数用于其他任何内容都没有任何意义)。
【讨论】:
int 成员的结构中,例如。你假设他正在尝试做类似char string[] = fread(data,8192,1,fp);
unsigned char buffer[8192]; fread( buffer, 8192, 1, fp );。然后,您必须根据指定的文件格式解释缓冲区。
fread() 可用于磁盘以外的 I/O 和 stdin,如从串行 I/O 读取部分 8192 块。
它们并不完全等价。
fread() 设计错误。它的设计忽略了在文件末尾部分读取的可能性,它不能用它的返回值来表示,它以你指定的大小为单位。
你真的应该只使用fread(),其中大小为 1,长度是你期望的字节数。只有这样,你才能妥善处理这种情况。对于char 以外的类型,这意味着提供sizeof char 作为大小,n*sizeof T 作为长度,其中n 是您期望的Ts 的数量。
【讨论】: