Программа отображает случайные списки данных при чтении из файла - PullRequest
0 голосов
/ 19 мая 2019

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

Я пытался использовать разные циклы, но по какой-то причине с циклом for он ничего не отображает, просто вылетает. Я новичок в C, поэтому прошу прощения, если вопрос слишком глупый ...: D

typedef struct {
    char ID[20];
    char date[11];
    int duration;
    double price;
} excursion;

typedef struct Trip {
    excursion data;
    struct Trip *next;
} trip;


trip *head=NULL;
trip *current=NULL;


void displayALL()
{
        trip *temp;

        temp = head;
        while (temp != NULL) {
                printf("ID of Excursion is %s\nDuration is %d days\nDate of departure is %s\nThe price is %.2f\n",
                                temp->data.ID, temp->data.duration, temp->data.date, temp->data.price);
                temp = temp->next;
        }
}

Я не буду показывать весь код, потому что другая часть работает Я пишу списки с этим кодом:

FILE * fp;
trip *temp;

if ((fp = fopen("Excursion.bin", "wb")) == NULL) {
        printf("Error opening file");
        exit(1);
}

for (temp = head; temp != NULL; temp = temp->next) {
        if (fwrite(&temp->data, sizeof(excursion), 1, fp) != 1) {
                printf("Error in writing file\n");
                exit(0);
        }
}
fclose(fp);

и прочитайте с этим:

FILE *fp;

if ((fp = fopen("Excursion.bin", "rb")) == NULL) {
        printf("No info added yet\n");
        exit(1);
}
while (1) {
        trip *temp = (trip*)malloc(sizeof(trip));
        if (head == NULL) {
                head = temp;
                current = head;
                current->next = NULL;
        } else {
                current->next = temp;
                current=temp;
                current->next = NULL;
        }
        if (fread(&temp->data, sizeof(excursion), 1, fp) != 1) {
                break;
                printf("Error reading file\n");
                exit(0);
        }
}
fclose(fp);

Это случайные данные, которые отображаются: ID экскурсии └ Продолжительность 0 дней Дата отправления Цена 0,00 ID экскурсии - И # ▌ Продолжительность -202182160 дней Дата отправления: дата ц · √№¤ ■ а5▐ Цена -1. # R

1 Ответ

1 голос
/ 19 мая 2019

Ваши основные проблемы прямо здесь.

if(fread(&temp->data, sizeof(excursion), 1, fp) != 1)

А здесь

if(fwrite(&temp->data,sizeof(excursion), 1, fp) != 1)

Получается, что вы пытаетесь записать всю структуру в свой файл и прочитать всю структуру, но по какой-то причине вы говорите, чтобы она помещалась в данные или извлекалась из данных. Данные - это не вся структура, это 11-байтовый массив символов внутри структуры.

Сделай это.

if(fread(temp, sizeof(excursion), 1, fp) != 1)

И

 if(fwrite(temp,sizeof(excursion), 1, fp) != 1)
...