Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fseek和fwrite过去的EOF_C_File_File Io_Binary - Fatal编程技术网

C fseek和fwrite过去的EOF

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允许在现有文件结尾之外进行搜索。如

首先假设我有一个20字节的二进制文件,由5个整数组成。现在让我们说,我试图:

fseek(fp, 2*sizeof(int), SEEK_END)
我试着打电话:

fwrite(&i, sizeof(int), 1, fp);
这可能吗

如果可能的话,新的二进制文件的大小是32还是24?如果是32,从位置20到27的二进制文件的内容是什么

  • 库实现不允许有意义地支持
    SEEK\u END
    因此,使用它的代码没有真正的标准可移植性)
以及:

POSIX允许在现有文件结尾之外进行搜索。如果输出是 执行此寻道后,从间隙读取的任何数据都将返回零 字节。在文件系统支持的情况下,这将创建一个稀疏文件


在my testsystem上
SEEK
pass
SEEK\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个)。唯一的缺点是,这些块在磁盘上不会“有序”,如果以后填充所有这些空块,则可能需要稍长的时间才能读取(就像一个碎片整理过的文件)。