C: сохранение динамического массива структур вместе со строкой - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь сохранить структуру (в списке)

typedef struct tupleStruct{

    int element[eMax];
    char * id;
    int eCount;

}tuple_t;

typedef struct {
    tuple_t * array;
    int used;
    int size;
} DynamicArray;

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

char id[256];

Есть ли способ сохранить структуру и строку в одном файле?(Учитывая, что мне нужно хранить несколько из них)

Редактировать: сохранение и загрузка кода

Загрузка

DynamicArray loadAllTuples(){

    FILE *filePointer;

    DynamicArray tempArray;

    if((filePointer=fopen("SavedTuples.bin","rb"))==NULL)
    {
        fputs("Something went wrong while loading!\nA blank Array will be loaded instead\n", stderr);
        setbuf(stdout, 0);

        //In case of error, blank array is initalised and loaded
        fclose(filePointer);

        intialiseDynamicArray(&tempArray);

        return tempArray;
    }



    fread(&tempArray, sizeof(DynamicArray),1,filePointer);

    //Freeing filePointer memory
    free(filePointer);

    return tempArray;

}

сохранение

void saveAllTuples(DynamicArray ToSave){

    trimArray(&ToSave,0); //Removing extra space from array

    FILE * filePointer;

    if((filePointer=fopen("SavedTuples.bin","wb"))==NULL)
    {
        fputs("Something went wrong while saving!\n", stderr);
        setbuf(stdout, 0);
        return;
    }

    fwrite(&ToSave, sizeof(ToSave), 1,filePointer);
    fclose(filePointer);

}

вызывается

saveAllTuples(dynaArray);

и

dynaArray=loadAllTuples();

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

char id[256];

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

0 голосов
/ 18 декабря 2018

Вместо того, чтобы писать всю структуру за один раз, запишите ее различные части, используя ваши знания о том, что они содержат.Так, например, если eCount - это количество значений в element, вы можете написать это

fwrite(&ToSave.eCount,sizeof(int), 1, filepointer);
fwrite(ToSave.element,sizeof(int), ToSave.eCount, filepointer);

и затем сохранить строковый компонент

size_t length=strlen(ToSave.id);
fwrite(&length,sizeof(int), 1, filepointer);
fwrite(ToSave.id,sizeof(char), length, filepointer);

Примечание: sizeof(char) обычно всегда равен 1, так что вы могли бы предположить, что вместо 1 sizeof(char) и 1, но я нахожу, что код выглядит более единообразно, чтобы оставить его внутри.

И затем вы полностью изменяете процесс, когда выполняетечтение

fwrite(&ToLoad.eCount,sizeof(int), 1, filepointer);
fwrite(ToLoad.element,sizeof(int), ToLoad.eCount, filepointer);
// etc...
...