我们知道调用fprintf或fwrite等函数不会立即将数据写入磁盘,相反,数据将被缓冲,直到达到阈值。我的问题是,如果我调用fseek函数,这些缓冲的数据会在寻找新位置之前写入磁盘吗?或者数据仍在缓冲区中,并写入新位置?
成
答案 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平台(或其他提供类似保证的平台)上,否则您不能指望它。