我将.txt文件中的数据保存并加载到动态数组时遇到了问题。
我的整个程序基于switch语句。 我将只粘贴这个负责为数组分配内存和调用函数的case来填充结构。以及用于保存和加载数据的功能。
代码看起来像这样
case 1:
system("cls");
printf("Enter amount of students you want to put in data base\n");
scanf("%d",&number_of_students);
student=(data*)malloc(number_of_students*sizeof(data));
adding_students_to_base( number_of_students); // its a simple functions based on for loop. I don't think that posting it here is necessary
break;
和功能:
void saving_base_to_file(int amount_of_students)
{
FILE *file;
system("cls");
printf("Saving base to file!\n");
file=fopen("database.txt","wb");
fprintf(file,"%d",amount_of_students); // function also saves amount of students in base
fwrite(student,sizeof( data),amount_of_students,file);
fclose(file);
_getch();
system("cls");
}
void loading_base_from_file()
{
FILE *file;
system("cls");
printf("Reading base from file\n");
file=fopen("database.txt","rb");
if (file!= NULL) {
fscanf(file,"%d",&number_of_students);
fread(&student,sizeof( data),number_of_students,file); //number_of_students is global variable
student=(data*)malloc(number_of_students*sizeof(data));
fclose(file);
}
else
{
printf("File does not exist!.\r\n");
printf("File have to be named ""database.txt"" !!!\n");
}
_getch();
system("cls");
}
(函数saving_base_to_file将number_of_students作为输入参数。)
当我想使用我的" loading_base_from_file"时出现问题功能
例如,当我想用student_id" 123456"命名为" Greg" "特斯拉",文件包含: database.txt。函数saving_base_to_file还可以节省基数的学生数量。但是,当我再次启动我的程序(或在一个程序运行中执行)并尝试从文件加载数据时,我的函数" print_base"打印这个: result
我认为" put"存在问题。数据到数组,但我不知道到底出了什么问题。 你能告诉我为什么会发生这种情况以及如何解决它?
答案 0 :(得分:0)
您使用student
表示它是指针。这意味着当您在变量上使用address-of运算符&
时,您将获得指向存储变量的位置的指针,而不是指向您分配的内存的指针。 &student
的类型为data **
而非data *
。
单独将导致未定义的行为,因为您将内存中的数据写入不应该存在的位置,但这不是唯一的问题。另一个问题是,在 之后,您从文件中读取数据,为student
分配内存,使student
完全指向其他地方并进行制作你丢失了刚读过的数据。
首先 分配内存,然后读入student
(而不是&student
)。
还有另一个问题,那就是混合文本数据和二进制数据。如果结构中的第一个元素包含可以解析为文本数字的值,则读取时读取的初始数字作为文件中的记录数将不正确。
您需要fwrite
号码,fread
号码。