Pull to refresh

fwrite/fread в windows могут повредить ваши данные

Reading time2 min
Views1.1K
Сегодня столкнулся с интересным поведением ошибкой в функциях стандартной библиотеки С fwrite/fread в windows xp (msvcrt.dll версии 7.0.2600.5512). Я писал данные (структуры) с помощью 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.
Tags:
Hubs:
Total votes 19: ↑11 and ↓8+3
Comments11

Articles