Почему fflush (input_filestream) не сбрасывает буфер в linux, как описывает manpage? - PullRequest
0 голосов
/ 07 марта 2019

человек fflush в Ubuntu:

Для входных потоков, связанных с доступными для поиска файлами (например, дисковые файлы, но не каналы или терминалы), fflush() отбрасывает любые буферизованные данные, которые были извлечены из базового файла, но не были использованы приложением.

Я прочитал несколько вопросов, говорящих о fflush(stdin) и fflush() входном потоке неопределенного поведения в соответствии со стандартом, это верно. Но для Linux, в частности, я прочитал комментарии, в которых говорится, что это не неопределенное поведение, а расширение, да, на странице руководства выше указано, как это будет работать с потоком ввода файлов.

Итак, почему fflush() входной файловый поток не отбрасывает буферизованные данные, которые были извлечены из базового файла, но не были использованы приложением. , как описывает man-страница?

Перед поиском в Интернете я полностью верю справочной странице, и теперь я хочу знать, если это не так.


Пример кода:

haha2.txt: 123456, без перевода строки или пробелов.

#include <stdio.h>

int
main()
{
    FILE* fp = fopen("haha2.txt", "r");
    int q = getc(fp);
    fflush(fp);
    int j = getc(fp); // I expect the rest variables to be -1(EOF) starting from here
    int j2 = getc(fp);// But they can still read data as if fflush does not executed
    int j3 = getc(fp);
    int j4 = getc(fp);

    int j5 = getc(fp);
    int j6 = getc(fp);
    int j7 = getc(fp);
    int j8 = getc(fp); 
    printf("%c,%c,%c,%c,%c,%c,%c,%c\n", j,j2,j3,j4,j5,j6,j7,j8);
    return(0);
}

1 Ответ

2 голосов
/ 07 марта 2019

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

Конечно, это предполагает, что ничего не произошло с файлом за это время (например, некоторые другиепроцесс перезаписи части файла, его усечение и т. д.).

Для иллюстрации, если вы измените свой код, добавив sleep после fflush:

#include <stdio.h>
#include <unistd.h>

int main() {
    FILE* fp = fopen("haha2.txt", "r");
    int q = getc(fp);
    fflush(fp);
    sleep(10);
    int j = getc(fp); // I expect the rest variables to be -1(EOF) starting from here
    printf("%d\n", j);
    return(0);
}

КогдаВы запускаете этот код и в другом терминале запускаете эту команду во время сна (эта команда удалит все содержимое из файла и установит его размер равным 0):

truncate -s0 haha2.txt

Затем код напечатает -1 (поскольку достигнут конец файла).

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

...