5

I have doubts about which order of the parameters size and count to use for fread/fwrite. If I want to read 8kb of data from file fp, which of the following is more efficient?

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

Also are there endiannes issues that I should be worried about?

4

2 回答 2

11

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

编辑:

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

于 2013-10-16T17:48:48.810 回答
3

它们并不完全等价。

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

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

于 2014-05-14T01:09:40.443 回答