Проблема
Чередование ввода и вывода из потока без сброса или позиционного вызова происходит, когда:
В режиме обновления для потока файлов не выполняется вызов сброса или позиционирования функции между операцией вывода и следующей операцией ввода.
Вызов позиционирования функции между операцией ввода и следующей операцией вывода для потока файлов в режиме обновления не выполняется.
РискЧередование операций ввода и вывода в потоке без промежуточного сброса или позиционного вызова является неопределенным поведением.
ЗафиксироватьЗвонить fflush() или функция позиционирования файлов, такая как fseek() или fsetpos() между операциями вывода и ввода в потоке обновления.
Вызов функции позиционирования файла между операциями ввода и вывода в потоке обновления.
Пример - Чтение после записи без промежуточного смыва#include <stdio.h>
#define SIZE20 20
void initialize_data(char* data, size_t s) {};
const char *temp_filename = "/tmp/demo.txt";
void func()
{
char data[SIZE20];
char append_data[SIZE20];
FILE *file;
file = fopen(temp_filename, "a+");
if (file == NULL)
{
/* Handle error. */;
}
initialize_data(append_data, SIZE20);
if (fwrite(append_data, 1, SIZE20, file) != SIZE20)
{
(void)fclose(file);
/* Handle error. */;
}
/* Read operation after write without
intervening flush. */
if (fread(data, 1, SIZE20, file) < SIZE20)
{
(void)fclose(file);
/* Handle error. */;
}
if (fclose(file) == EOF)
{
/* Handle error. */;
}
}
В этом примере файл demo.txt открывается для чтения и добавления. После звонка на fwrite(), звонок на fread() без промежуточной операции очистки является неопределенным поведением.
Исправление - вызов fflush() Перед операцией чтенияПосле записи данных в файл перед вызовом fread(), выполните вызов «flush».
#include <stdio.h>
#define SIZE20 20
void initialize_data(char* data, size_t s) {};
const char *temp_filename = "/tmp/demo.txt";
void func()
{
char data[SIZE20];
char append_data[SIZE20];
FILE *file;
file = fopen(temp_filename, "a+");
if (file == NULL)
{
/* Handle error. */;
}
initialize_data(append_data, SIZE20);
if (fwrite(append_data, 1, SIZE20, file) != SIZE20)
{
(void)fclose(file);
/* Handle error. */;
}
/* Buffer flush after write and before read */
if (fflush(file) != 0)
{
(void)fclose(file);
/* Handle error. */;
}
if (fread(data, 1, SIZE20, file) < SIZE20)
{
(void)fclose(file);
/* Handle error. */;
}
if (fclose(file) == EOF)
{
/* Handle error. */;
}
}