2016-03-05 4 views
0

Я записываю функцию, которая должна сохранять 3 структуры (2 из них являются массивами структур) в двоичном файле. Вот моя функция:Сохранение нескольких структур в двоичный файл (C)

void saveFile(Struct1 *s1, Struct2 *s2, Struct3 s3) { 
    FILE *fp = NULL; 
    fp = fopen("save.bin", "w+b"); 

    if (fp == NULL) { 
     printf("Save failed.\n"); 
    } 

    fwrite(s1, sizeof(Struct1), struct3.nElements, fp); 
    fwrite(s2, sizeof(Struct2), NELEMENTS, fp); 
    fwrite(&s3, sizeof(Struct3), 1, fp); 

    printf("Save done.\n"); 
} 

s1 имеют struct3.nElements, s2 имеют NELEMENTS (это константа) и s3 только одна структура, а не массив. Когда я пытаюсь открыть save.bin с помощью HexEditor, он дает очень разные результаты от тех, которые я ожидал, мне интересно, правильно ли я использовал функцию fwrite, особенно для массива структур.

+1

Какие результаты вы получили с помощью шестнадцатеричного редактора, результаты которого вы ожидали и что вы записали в свой файл. Вы должны поделиться этой информацией с нами, если хотите получить ответы. Читайте о [MCVE] (http://stackoverflow.com/help/mcve). –

+0

@MichaelWalz, когда я использую HexEditor Я вижу случайные символы, некоторые правильные поля 'struct2', а также пути некоторых программ, таких как Visual Studio. Очевидно, я ожидаю увидеть правильные значения структур. – THZ

+1

Покажите, как вы называете 'saveFile'. Вероятно, проблема. И покажите объявления 'struct1',' struct2' и 'struct3'. –

ответ

1

Есть небольшие проблемы с вами работать, что может вызвать проблемы:

  • вы определяете функцию, принимая s3 по значению. Почему бы не передать указатель на третий struct? Правильно ли объявлена ​​функция saveFile перед кодом вызова? Вы уверены, что код вызова передает значение struct?

  • Вы забываете закрыть поток. Ручка теряется, и содержимое не сбрасывается на диск, пока программа не выйдет.

  • Вы открываете файл в "w+b" режиме: пишите с чтением. Правильно использовать двоичный режим, но не нужно добавлять + для чтения. Просто используйте "wb".

  • Если fopen не работает, выдается диагностическое сообщение, но вы не возвращаетесь от функции. Вы будете ссылаться на неопределенное поведение при попытке записать указатель потока NULL.

Что касается вашего вопроса, то дамп файла не соответствует тому, что вы ожидаете ... дать нам больше информации, например, определение различных структур и шестнадцатеричный дамп. Вот некоторые идеи:

  • Некоторым из полей в структурах может потребоваться определенная выровненность и, следовательно, они будут отделены от предыдущего поля пробелами. Значения этих байтов заполнения не обязательно 0: если структуры находятся в автоматическом хранилище или выделены malloc, их начальное состояние не определено и может быть изменено как побочный эффект хранения других полей.
  • Целые числа могут иметь разные размеры и быть сохранены в файле с минимальным или большим энтиансом, в зависимости от конкретной архитектуры, с которой скомпилирована ваша программа. По этой причине значения, хранящиеся в вашей программе, должны быть прочитаны только с соответствующим, но достаточно похожим кодом, работающим на той же архитектуре и ОС.
  • Если в ваших структурах есть указатели, вы не можете иметь смысл из значений, хранящихся в выходном файле.
+0

«Вы забываете закрыть поток. Ручка теряется, и содержимое не сбрасывается на диск, пока программа не выйдет». является лучшим подозреваемым. AFAIK, данные даже не нужно писать, если отсутствует закрытие/скрытие. – chux

+0

@chux: C11 7.22.4.4: функция 'exit': * Затем все открытые потоки с неписаными буферизованными данными очищаются, все открытые потоки закрыты, а все файлы, созданные функцией tmpfile, удаляются. * – chqrlie

+1

True, но код не опубликован, как все закончилось. Рассмотрим 'abort _Exit'. «открытые потоки закрыты, или временные файлы удалены, определяется реализацией». Отражательная способность OP для публикации полного MCVE со структурами, считывание данных и наблюдение за ними все способствуют возникновению ненужных проблем при ответе на этот пост. – chux

Смежные вопросы