如何用C语言中的文件解决这个问题?

如何用C语言中的文件解决这个问题?,c,file,io,C,File,Io,出于某种原因,函数loadPerson总是返回0作为输出 我认为这个问题与structPERSON中的变量分数有关,但我不知道问题是什么。例如,我不知道保存函数是否会保存分数或地址的值(因为它是一个指针) 你能帮我找到这个问题吗 #include <stdlib.h> #include <stdio.h> #define N 3 typedef struct person{ int age; float *scores; } PERSON; int

出于某种原因,函数
loadPerson
总是返回
0
作为输出

我认为这个问题与struct
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;
}       
#包括
#包括
#定义n3
typedef结构人{
智力年龄;
浮动*分数;
}人;
int savePerson(PERSON-PERSON,char*fileName){
文件*文件;
int结果=0;
file=fopen(文件名,“wb”);
如果(文件){
if(fwrite(&person,sizeof(person),1,file)>0){
结果=1;
}
}
返回结果;
}
int loadPerson(PERSON*PERSON,char*fileName){
文件*文件;
int结果=0;
file=fopen(文件名为“rb”);
如果(文件){
如果(fread(person,sizeof(person),1,file)>0){
结果=1;
}
}
}
int main()
{
char fileName[15]=“file1.bin”;
浮动分数[3]={2.0,8.0,9.0};
人p1、p2;
int i;
p1.年龄=35岁;
p1.分数=分数;
printf(“萨尔凡多”);
if(保存人(p1,文件名)){
printf(“保存确定!\n”);
}
否则{
printf(“保存错误!\n”);
}
if(loadPerson(&p2,文件名)){
printf(“加载正常!”);
printf(“年龄:%d\n”,p2.年龄);
printf(“分数:\n”);

对于(i=0;i查看函数原型:
intloadperson(PERSON*PERSON,char*fileName)
您忘记了在函数末尾返回结果;

此外,一旦解决此问题,您在尝试将数组写入文件时也会遇到类似的问题。您可能希望将结构更新为以下内容:

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

失败与数据结构的内容无关。此函数失败的方式很少。下面的版本将让您了解哪种情况

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
结构。如果它读取一个项目,您应该从
fread
获得
1
的返回值。请检查文件的大小。)


当然,如果函数成功,调用代码仍然需要知道这一点。即使函数声明为返回
int
,您的代码也没有返回值。我冒昧地返回了您明确打算用于此目的的值。我建议您仔细查看编译器未发出警告的原因您可能会注意到这个严重的问题……或者,如果它发生了,您为什么会忽略它。

请定义“工作不正常”.程序崩溃了吗?它让你的房子着火了吗?它输出的内容是否超出了你的预期,如果是,请详细说明。我猜它并不总是返回0。请提供一个更详细的解释,说明你的问题是什么。像“工作不正常”这样的表达式无助于找出问题所在。你应该d说明你的预期输出是什么,实际输出是什么,以及为什么你说实际输出是错误的。我为什么要这样使用这个结构?因为目前这个结构包含一个指针。所以你将把分数的地址写入文件,而不是分数。