Проблема
Чередование ввода и вывода от потока без сброса или расположение вызова происходят когда:
Вы не выполняете сброс или вызов расположения функции между выходной операцией и следующей входной операцией на потоке файла в режиме обновления.
Вы не выполняете вызов расположения функции между входной операцией и следующей выходной операцией на потоке файла в режиме обновления.
Риск
Чередование операций ввода и вывода на потоке без прошедшего сброса или расположение вызова являются неопределенным поведением.
Фиксация
Вызовите 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()
, выполните вызов сброса.
#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. */;
}
}