Сегодня столкнулся с интересным поведением ошибкой в функциях стандартной библиотеки С fwrite/fread в windows xp (msvcrt.dll версии 7.0.2600.5512). Я писал данные (структуры) с помощью fwrite, а после этого сразу читал следующие за записанными с помощью fread. В результате первая прочитанная структура в файле повреждалась.
Решение было найдено в принудительном сбросе данных на диск после записи.
Создадим два файла с одинаковым содержимым «12345» и выполним следующий код:
В результате, содержимое первого файла — «1b?45» (где "?" случайный байт, у меня был 0x01, у товарища 'H'), второго — «1b345». Как видите, первый файл повреждён. Поэтому будьте осторожны при записи/чтении с fwrite/fread.
Решение было найдено в принудительном сбросе данных на диск после записи.
Создадим два файла с одинаковым содержимым «12345» и выполним следующий код:
#include <stdio.h>
#include <assert.h>
int main()
{
char byte1 = 'b';
char byte2 = 'b';
FILE * f1 = fopen ("1", "r+b");
FILE * f2 = fopen ("2", "r+b");
assert (f1 != NULL);
assert (f2 != NULL);
fseek (f1, 1, SEEK_SET);
fseek (f2, 1, SEEK_SET);
fwrite (&byte1, sizeof(char), 1, f1);
fread (&byte1, sizeof(char), 1, f1);
fwrite (&byte2, sizeof(char), 1, f2);
fflush (f2);
fread (&byte2, sizeof(char), 1, f2);
fclose (f1);
fclose (f2);
return 0;
}
В результате, содержимое первого файла — «1b?45» (где "?" случайный байт, у меня был 0x01, у товарища 'H'), второго — «1b345». Как видите, первый файл повреждён. Поэтому будьте осторожны при записи/чтении с fwrite/fread.