Двоичные файлы и написание структур для них - PullRequest
0 голосов
/ 13 марта 2012

Попытка написать функцию, которая будет записывать мой структурный массив в двоичный файл.
Я думал, что смог скопировать его как единое целое по одному массиву за раз, но он не работает для меня.

Нужно ли писать каждую отдельную суб-сущность или есть способ сделать это большим скоплением?

    {

       void export_binary(char *data_base_name, student_record *ptr,int array_flag,unsigned int rec_cnt)
    {
       if (array_flag==-99)
            {
                printf("\n\nDatabase not loaded...\n\nPlease IMPORT or CREATE a new database.\n\n");
                system("pause");
                return;
            }

    int rec_counter;
    FILE *pf;

        pf=fopen(data_base_name,"wb");

        if (!pf)
            {
                printf("*** FILE OPENING ERROR ***\n\n");
                system("pause");
                return ;
            }
        for ( rec_counter=0; rec_counter <= rec_cnt; rec_counter++)
            {
                fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf);
            }


                if ((fclose(pf))!=0)
            {
                printf("\n\n*** FILE Error - Closing file FAILED! ***\n\n");
                system("pause");
                return;
            }
                printf("\n\n*** Database SAVED ***");
                system("pause");
                return;
}

1 Ответ

2 голосов
/ 13 марта 2012

Вы на самом деле не говорите, что ошибка (это жизненно важно, когда вы пытаетесь обратиться за помощью), но, если у вас нет ничего похожего на указатели в ваших структурах, выможно сделать все сразу, заменив:

for ( rec_counter=0; rec_counter <= rec_cnt; rec_counter++)
{
    fwrite(&ptr[rec_counter], sizeof(student_record), 1, pf);
}

на:

int actual = fwrite (ptr, sizeof(student_record), rec_cnt, pf);
if (actual != rec_cnt) ... a problem occurred.

(вы должны всегда проверять возвращаемое значение).

Так что нет, вам не нужно записывать каждый элемент каждой структуры в массив отдельно, вы можете пойти другим путем и записать весь массив в одно нажатие.


Что касается вашего дополнительногоinfo:

Я получаю файл, в котором есть элемент моих записей, но мусор для всего остального.

Да, если вы напишите больше записейчем вы населили.Другими словами, если rec_cnt - это размер массива, а не количество заполненных элементов массива, в конце вы получите мусор.

Я предполагал (возможно, неправильно), что rec_cnt было количество заполненных элементов.У вас должна быть переменная, которая имеет это значение где-то (если rec_cnt не так), поскольку в противном случае вы не знаете, какие элементы хороши, а какие - мусор.

Используйте , переменная, определяющая, сколько элементов записать с помощью fwrite.


Если это не мусор более поздних элементов массива, а неиспользуемый пробел внутри каждого элемента, то это ожидаемои не имеет значения.Конструкциям разрешено иметь отступы внутри них (и в конце) для выравнивания.

При условии, что заполнение идентично при записи и чтении, вы можете смело игнорировать его.

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

  • отключить заполнение для структуры (поддержка, определяемая реализацией, например, #pragma pack);или
  • запишите поля структуры отдельно, чтобы удалить заполнение.
...