Будет ли функция fseek сбрасывать данные в буфере в C ++? - PullRequest
2 голосов
/ 21 сентября 2011

Мы знаем, что вызов таких функций, как fprintf или fwrite, не будет записывать данные на диск немедленно, вместо этого данные будут буферизироваться до достижения порогового значения.Мой вопрос: если я вызову функцию fseek, будут ли эти буферизованные данные записаны на диск перед поиском новой позиции?Или данные все еще находятся в буфере и записываются в новую позицию?

cheng

Ответы [ 5 ]

2 голосов
/ 21 сентября 2011

Я не знаю, гарантированно ли очищен буфер, но может не быть, если вы стремитесь к позиции достаточно близко.Однако нет никакой возможности, чтобы буферизованные данные были записаны на новую позицию.Буферизация - это просто оптимизация, поэтому она должна быть прозрачной.

2 голосов
/ 21 сентября 2011

Да; fseek() гарантирует, что файл будет выглядеть так, как должен в соответствии с fwrite() выполненными вами операциями.

Стандарт C, ISO / IEC 9899: 1999 §7.19.9.2 fseek(), гласит:

Функция fseek устанавливает индикатор положения файла для потока, на который указывает поток. Если происходит ошибка чтения или записи, устанавливается индикатор ошибки для потока и происходит сбой fseek.

1 голос
/ 21 сентября 2011

Кажется, что вы действительно беспокоитесь о том, окажутся ли ранее записанные (но еще не сброшенные) данные в неправильном месте файла, если вы выполните fseek.

Нет, этого не произойдет. Он будет вести себя так, как вы ожидаете.

1 голос
/ 21 сентября 2011

Я не верю, что указано, что данные должны быть сброшены на fseek, но когда данные фактически записываются на диск, они должны быть записаны в той позиции, в которой находился поток при вызове функции записи. Даже если данные все еще буферизируются, этот буфер не может быть записан в другую часть файла, когда он очищен, даже если был последующий поиск.

0 голосов
/ 21 сентября 2011

У меня смутные воспоминания о требовании, которое вы называете fflush раньше fseek, но у меня нет моей копии стандарта C, доступной для проверки. (Если вы этого не сделаете, было бы неопределенное поведение или определение реализации, или что-то в этом роде.) Общий стандарт Unix указывает, что:

Если самая последняя операция, кроме ftell (), для данного потока fflush (), смещение файла в базовом описании открытого файла должен быть скорректирован, чтобы отразить местоположение, указанное fseek ().

[...]

Если поток доступен для записи и буферизованные данные не были записаны в базовый файл, fseek () должен привести к тому, что неписанные данные будут записывается в файл и должен пометить поля st_ctime и st_mtime файл для обновления.

Это помечено как расширение стандарта ISO C, поэтому вы не можете рассчитывать на него, за исключением платформ Unix (или других платформ, которые дают аналогичные гарантии).

...