将结构从txt文件加载到动态数组

时间:2016-06-05 10:03:59

标签: c arrays file-io structure

我将.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"存在问题。数据到数组,但我不知道到底出了什么问题。 你能告诉我为什么会发生这种情况以及如何解决它?

1 个答案:

答案 0 :(得分:0)

您使用student表示它是指针。这意味着当您在变量上使用address-of运算符&时,您将获得指向存储变量的位置的指针,而不是指向您分配的内存的指针。 &student的类型为data **而非data *

单独将导致未定义的行为,因为您将内存中的数据写入不应该存在的位置,但这不是唯一的问题。另一个问题是,在 之后,您从文件中读取数据,为student 分配内存,使student完全指向其他地方并进行制作你丢失了刚读过的数据。

首先 分配内存,然后读入student(而不是&student)。

还有另一个问题,那就是混合文本数据和二进制数据。如果结构中的第一个元素包含可以解析为文本数字的值,则读取时读取的初始数字作为文件中的记录数将不正确。

您需要fwrite号码,fread号码。