Как решить эту проблему с файлами в C? - PullRequest
0 голосов
/ 01 ноября 2018

По какой-то причине функция loadPerson всегда возвращает 0 в качестве вывода.

Я думаю, что проблема связана с переменными баллами в структуре PERSON, но я не знаю, в чем проблема. Например, я не знаю, сохранит ли функция сохранения значения баллов или адреса (так как это указатель).

Можете ли вы помочь мне найти проблему?

#include <stdlib.h>
#include <stdio.h>

#define N 3

typedef struct person{
    int age;
    float *scores;
} PERSON;

int savePerson(PERSON person, char *fileName){
    FILE *file;
    int result = 0;
    file = fopen(fileName,"wb");
    if (file){
        if(fwrite(&person,sizeof(PERSON),1,file)>0){
            result = 1;
        }
    }
    return result;
}

int loadPerson(PERSON *person, char *fileName){
    FILE *file;
    int result = 0;
    file = fopen(fileName,"rb");
    if (file){
        if(fread(person,sizeof(PERSON),1,file)>0){
            result = 1;
        }
    }
}

int main()
{
    char fileName[15] = "file1.bin";
    float scores[3] = {2.0,8.0,9.0};
    PERSON p1,p2;
    int i;

    p1.age = 35;
    p1.scores = scores;
    printf("Salvando\n");
    if(savePerson(p1,fileName)){
        printf("Saving OK!\n");
    }
    else{
        printf("Saving BAD!\n");
    }

    if(loadPerson(&p2,fileName)){
        printf("Loading OK!");
        printf("AGE: %d\n",p2.age);
        printf("SCORES:\n");
        for(i=0;i<N;i++){
            printf("%f,",p2.scores[i]);
        }
        printf("\n");
    }
    else{
        printf("Loading BAD!");
    }
    return 0;
}       

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

int loadPerson(PERSON *person, char *fileName){
    FILE *file;
    int result = 0;
    file = fopen(fileName,"rb");
    if (file){
        if(fread(person,sizeof(PERSON),1,file)>0){
            result = 1;
        }else{
            printf("File read error!");
        }
    }else{
        printf("File not found: %s", fileName);
    }
    return result;
}

Либо файл, который вы пытаетесь открыть, не существует, либо он не содержит достаточно данных для чтения одной структуры. В любом случае будет напечатано сообщение об ошибке.

(«Файл не найден», скорее всего, потому что файл находится в одном каталоге, а ваша программа выполняется с другим параметром текущий каталог . Вам нужно взглянуть на свою среду разработки, чтобы исправить это «Ошибка чтения файла» сразу после успешного открытия файла , вероятно, означает, что файл, из которого вы пытаетесь прочитать, не содержит достаточно байтов для чтения одной структуры PERSON. Вы должны получить возврат значение 1 из fread, если он читает один элемент. Проверьте размер вашего файла.)

Конечно, если функция завершается успешно, вызывающему коду все равно нужно это знать. Ваш код не возвратил значение, даже если функция была объявлена ​​как возвращающая int. Я позволил себе вернуть стоимость, которую вы явно намеревались использовать для этой цели. Я рекомендую вам внимательно посмотреть, почему ваш компилятор не предупредил вас об этой серьезной проблеме ... или, если это так, почему вы проигнорировали это.

0 голосов
/ 01 ноября 2018

Глядя на прототип функции: int loadPerson(PERSON *person, char *fileName) Вы забыли return result; в конце своей функции.

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

typedef struct person{
    int age;
    float scores[N];
} PERSON;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...