2013-10-16 120 views
5

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

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

也有endiannes问题,我应该担心?

回答

11

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

编辑:

由于simonc指出,(然后将其删除,因为他没有得到它100%正确的---但他的观点是有效的):有是关于返回值(差别你需要使用它来知道函数是否工作)。 fread(buffer, 8192, 1, fp)将返回0或1,只有当所有8192个字节被读取时才返回1。另外,Posix说缓冲区的内容没有为部分读取的对象指定。在实践中,缓冲区将被填充尽可能多的字节,但由于您不知道有多少字节,这并不会给您带来太多的收益。总之,你应该总是使用fread(buffer, 1, 8192, fp);(因为除了字节缓冲区以外的任何东西都没有意义)。

+0

好吧,由于它是字节,明显的字节顺序会起一定的作用。想象一下,他正试图将这8kb数据读入一个具有“int”成员的结构中。你假设他正在尝试做类似'char string [] = fread(data,8192,1,fp);' – fvdalcin

+3

@fvdalcin他正在读字节。字节没有字节序。一旦他阅读了他们,他必须根据文件格式的规范来解释它们。这通常应该在没有考虑排序的情况下完成。 –

+0

@fvdalcin是的,这些函数唯一合理的用法是'unsigned char buffer [8192]; fread(buffer,8192,1,fp);'。之后,您必须根据指定的文件格式来解释缓冲区。 –

2

它们不完全相同。

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

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