我们在这里讨论了为什么fread和fwrite为每个成员计算一个大小并计算并返回读/写成员的数量,而不仅仅是采用缓冲区和大小.我们可以想到的唯一用途是,如果你想读/写一个结构数组,这些结构不能被平台对齐整除,因此已被填充,但这并不能保证这一选择在设计中.
来自FREAD(3):
函数fread()从流指向的流中读取数据的nmemb元素,每个数据字节长,将它们存储在ptr给定的位置.
函数fwrite()将每个大小字节长的数据的nmemb元素写入stream指向的流,从ptr给出的位置获取它们.
fread()和fwrite()返回成功读取或写入的项目数(即不是字符数).如果发生错误或达到文件结尾,则返回值为短项目计数(或零).
我正在写一个大型数字二维数组到二进制文件(最终大小~75 MB).
我在linux系统上这样做.首先,有没有比fwrite更好的方法或系统调用来尽可能快地写入文件?
其次,如果我应该使用fwrite,那么我应该把整个文件写成1个连续的行吗?
fwrite( buf, sizeof(float), 6700*6700, fp );
Run Code Online (Sandbox Code Playgroud)
或者把它写成一系列的块
fwrite( buf, sizeof(float), 8192, fp );
fwrite( *(buf+8192), sizeof(float), 8192, fp );
....
Run Code Online (Sandbox Code Playgroud)
如果我应该写下这篇文章,每个大块应该有多大?
我怀疑用于fread/fwrite的参数大小和计数的顺序.如果我想从文件fp中读取8kb的数据,以下哪项更有效?
fread(data,1,8192,fp)
fread(data,8192,1,fp)
Run Code Online (Sandbox Code Playgroud)
还有我应该担心的endiannes问题吗?