【发布时间】:2015-07-26 22:03:07
【问题描述】:
我对 C 中的 fseek() 用法有疑问。我知道它可以设置由 fopen() 创建的文件描述符的偏移位置。但是它也可以设置一个新创建的文件的偏移位置吗?更具体地说,我可以:
FILE * pFile;
pFile = fopen ( "myfile.txt" , "wb" ); //myfile.txt doesn't exit before
fseek ( pFile , 1024*1024*1024 , SEEK_SET);
fclose(pFile);
它会创建一个大小为 1 GB 且没有内容的文件吗?还是我至少应该写一些东西来创建这个 1 GB 的文件?
【问题讨论】:
-
我有理由肯定会有内容,它只是随机内容,就像分配的磁盘区域中发生的一样。您可能希望将数据区初始化为某个已知值。
-
但是pubs.opengroup.org/onlinepubs/009695399/functions/fseek.html 说“fseek() 函数应允许将文件位置指示符设置在文件中现有数据的末尾之外。如果稍后在此时写入数据,则后续读取间隙中的数据应返回值为 0 的字节,直到数据实际写入间隙。”但是,如果您关闭文件然后再次打开它会发生什么?它还会记得吗?
-
搜索只会移动位置,但不会扩展文件,除非您在该位置写入内容。
-
正如@MarioZannone 所说。附带说明一下,当您想要处理非常大的文件时,最好使用
fseeko()。 -
fseek可能允许在文件末尾之外进行搜索,但没有明确说明文件大小是否因此而扩展。lseek明确指出,自行查找不会扩展文件的大小。换句话说,在使用lseek时,您需要某种形式的写入操作来扩展文件的大小。但是,没有任何东西禁止或允许fseek以相同的方式行事。 C11 草案 N1570 指出,“如果发生读取或写入错误,则会设置流的错误指示符并且fseek失败。”