2

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

4

5 回答 5

2

是的; 根据您执行fseek()的操作,确保文件看起来像它应该的样子。fwrite()

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

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

于 2011-09-21T07:13:34.623 回答
2

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

于 2011-09-21T07:13:38.770 回答
1

我不认为它指定必须在 a 上刷新数据,fseek但是当数据实际写入磁盘时,它必须写入到调用 write 函数时流所在的位置。即使数据仍处于缓冲状态,该缓冲区在刷新时也无法写入文件的不同部分,即使有后续查找也是如此。

于 2011-09-21T07:14:23.073 回答
1

看来您真正关心的是,如果您执行fseek.

不,这不会发生。它会按照您的预期运行。

于 2011-09-21T07:15:34.987 回答
0

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

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

[...]

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

然而,这被标记为对 ISO C 标准的扩展,因此除了 Unix 平台(或做出类似保证的其他平台)之外,您不能指望它。

于 2011-09-21T07:33:19.197 回答