【问题标题】:fseek a newly created filefseek 一个新创建的文件
【发布时间】: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 失败。”

标签: c file fseek


【解决方案1】:

http://en.cppreference.com/w/c/io/fseek

POSIX 允许在现有文件末尾之外进行查找。如果输出是 在此搜索之后执行,从间隙中读取的任何内容都将返回零 字节。在文件系统支持的情况下,这会创建一个sparse file

【讨论】:

    【解决方案2】:

    你可以这样做,它会创建间隙文件。从间隙中读取的任何内容都返回零字节。系统会针对文件系统进行优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多