C fseek和fwrite过去的EOF
首先假设我有一个20字节的二进制文件,由5个整数组成。现在让我们说,我试图:C fseek和fwrite过去的EOF,c,file,file-io,binary,C,File,File Io,Binary,首先假设我有一个20字节的二进制文件,由5个整数组成。现在让我们说,我试图: fseek(fp, 2*sizeof(int), SEEK_END) 我试着打电话: fwrite(&i, sizeof(int), 1, fp); 这可能吗 如果可能的话,新的二进制文件的大小是32还是24?如果是32,从位置20到27的二进制文件的内容是什么 库实现不允许有意义地支持SEEK\u END(因此,使用它的代码没有真正的标准可移植性) 以及: POSIX允许在现有文件结尾之外进行搜索。如
fseek(fp, 2*sizeof(int), SEEK_END)
我试着打电话:
fwrite(&i, sizeof(int), 1, fp);
这可能吗
如果可能的话,新的二进制文件的大小是32还是24?如果是32,从位置20到27的二进制文件的内容是什么
- 库实现不允许有意义地支持
(因此,使用它的代码没有真正的标准可移植性)SEEK\u END
在my testsystem上
SEEK
passSEEK\u END
使用nullbytes填充文件的剩余部分,直到新文件指针。建议fseek(fp,7*sizeof(int),SEEK\u BEGIN)
以避免“二进制流不需要有意义地支持带有SEEK\u END whence值的fseek调用。”这是否意味着不能调用fseek(fp,2*sizeof(int),SEEK_END),但可以调用fseek(fp,7*sizeof(int),SEEK_SET)。如果我尝试在该位置调用fwrite,新文件大小将仅为24,我不太理解稀疏文件的含义。@Janjan这取决于系统是否支持它,因此代码不会真正可移植。@Janjan稀疏文件只会将包含数据的块写入磁盘(大部分为16kB块)并用\0“填充”其余部分。例如,如果你有一个文件,开头有100字节,大约1GB有100字节,那么你的1GB文件在磁盘上只占32kB(磁盘上没有的部分都是零)。如果我试图使用fread访问这个文件,我必须使用与调用fwrite相同的指针位置吗?@Janjan是的,操作系统会处理所有这些(从代码上看,如果数据在磁盘上或是虚拟零,则没有区别)。如果以后以500MB左右的速度写入,将向磁盘写入一个新的16kB块(或2个)。唯一的缺点是,这些块在磁盘上不会“有序”,如果以后填充所有这些空块,则可能需要稍长的时间才能读取(就像一个碎片整理过的文件)。