如何用C中的文件解决此问题?

时间:2018-11-01 14:51:27

标签: c file io

由于某种原因,函数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 :(得分:0)

查看函数原型:int loadPerson(PERSON *person, char *fileName) 您忘了在功能结束时return result;

此外,一旦解决该问题,您将遇到尝试像这样将数组写入文件的问题。您可能希望将结构更新为以下内容:

typedef struct person{
    int age;
    float scores[N];
} PERSON;

答案 1 :(得分:0)

失败与数据结构的内容无关。此功能失败的方式很少。以下版本可让您找出情况。

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,您的代码也没有返回值。我自由地返回您明确打算用于此目的的价值。我建议您仔细研究一下为什么编译器没有警告您这个严重的问题……或者,如果这样做,您为什么忽略了它。