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