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