fseek会在C ++中用缓冲区函数刷新缓冲区中的数据吗?

时间:2011-09-21 07:11:18

标签: c++ file fseek

我们知道调用fprintf或fwrite等函数不会立即将数据写入磁盘,相反,数据将被缓冲,直到达到阈值。我的问题是,如果我调用fseek函数,这些缓冲的数据会在寻找新位置之前写入磁盘吗?或者数据仍在缓冲区中,并写入新位置?

5 个答案:

答案 0 :(得分:2)

是; fseek()根据您执行的fwrite()操作确保文件看起来应该如此。

C标准,ISO / IEC 9899:1999§7.19.9.2fseek(),说:

  

fseek函数为stream指向的流设置文件位置指示符。   如果发生读或写错误,则设置流的错误指示符并且fseek失败。

答案 1 :(得分:2)

我不知道是否保证冲洗缓冲,如果你寻找足够接近的位置,它可能不会。但是,缓冲数据无法写入新位置。缓冲只是一种优化,因此它必须是透明的。

答案 2 :(得分:1)

我不相信它指定必须在fseek上刷新数据,但是当数据实际写入磁盘时,必须写入当写入函数时流所在的位置。调用。即使数据仍然被缓冲,即使存在后续搜索,该缓冲区在刷新时也无法写入文件的不同部分。

答案 3 :(得分:1)

您真正担心的是,如果您执行fseek,先前写入(但尚未刷新)的数据是否会在文件中的错误位置结束。

不,那不会发生。它会按照您的预期行事。

答案 4 :(得分:0)

我对你之前致电fflush的要求有一些模糊的记忆 fseek,但我没有可用于验证的C标准副本。 (如果不这样做,那将是未定义的行为或实现定义, 或类似的东西。)常见的Unix标准规定:

  

如果给定流上的最新操作(ftell()除外)是   fflush(),底层打开文件描述中的文件偏移量   应调整以反映fseek()指定的位置。

     

[...]

     

如果流是可写的,并且尚未写入缓冲数据   底层文件fseek()将导致未写入的数据   写入文件并标记st_ctime和st_mtime字段   要更新的文件。

然而,这被标记为ISO C标准的扩展,因此除非在Unix平台(或其他提供类似保证的平台)上,否则您不能指望它。