将malloc'd C结构写入文件,并从中读取

时间:2012-09-06 01:41:35

标签: c file struct malloc

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stCrimeArchive {
   char id_student[10];
   int id_document;
   char judgement[30];
   int id_crime;
   char date[12];
   char id_police[12];
};

int main()
{
   struct stCrimeArchive *regi;
   FILE *filea;
   filea = fopen("crimearchives.dat", "r+b");          
   if(!filea) 
 filea = fopen("crimearchives.dat", "w+b");

   int i;
   char num[6];

   regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));

   printf("ID DOCUMENT: ");
   fgets(num, 6, stdin);
   regi->id_document= atoi(num);

   printf("ID STUDENT: ");
   fgets(regi->id_student, 30, stdin);
   for(i = strlen(regi->id_student)-1; i && regi->id_student[i] < ' '; i--)
    regi->id_student[i] = 0;

   printf("CRIME CODE: ");
   fgets(num, 6, stdin);
   regi->id_crime = atoi(num);

   printf("DATE OF THE CRIME: ");
   fgets(regi->date, 30, stdin);
   for(i = strlen(regi->date)-1; i && regi->date[i] < ' '; i--)
    regi->date[i] = 0;   

   printf("ID POLICE: ");
   fgets(regi->id_police, 30, stdin);
   for(i = strlen(regi->id_police)-1; i && regi->id_police[i] < ' '; i--)
    regi->id_police[i] = 0;  

   printf("JUDGEMENT: ");
   fgets(regi->judgement, 30, stdin);
   for(i = strlen(regi->judgement)-1; i && regi->judgement[i] < ' '; i--)
    regi->judgement[i] = 0;     

   fseek(filea, 0, SEEK_END);
   fwrite(&regi, sizeof(struct stCrimeArchive*), 1, filea);

   free(regi);
   fclose(filea);
}  

上下文如下:我正在创建一个可变长度文件,并且在其上我正在使用上面显示的结构编写许多犯罪存档。要做到这一点,我需要为所涉及的结构做一个malloc。问题是当我把它写入文件时,它没有写任何东西,我不知道我在做什么错误。

另外,我想从同一个文件中读取犯罪档案,但我也不知道我做错了什么。这是我想要做的代码:

int main()
{ 
   struct stCrimeArchive *regi;
   regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
   FILE *filea;
   filea = fopen("crimearchives.dat", "r+b");          
   if(!filea) 
    filea = fopen("crimearchives.dat", "w+b");
   rewind(filea);
   while  (fread(&regi, sizeof(struct stCrimeArchive), 1, filea))
    printf("%2d %-11s %-11s %8d %-13s %-14s\n", regi->id_document, regi->id_police, regi->date, regi->id_crime, regi->id_student, regi->judgement);
   fclose(filea);
}

5 个答案:

答案 0 :(得分:4)

如果我是你,我会忘记在你的例子中使用malloc。您不需要动态内存分配。

struct CrimeArchive regi;
regi.id_student = 42;
/* do all your stuff here */

FILE* fp = fopen("crimearchives.dat", "wb");
if (fp != NULL) {
    if (fwrite(&regi, sizeof regi, 1, fp) != 1)
       { /* handle error */ }

    fclose(fp);
}

当你读它时也一样:

struct CrimeArchive regi;

FILE* fp = fopen("crimearchives.dat", "rb");
if (fp != NULL) {
   if (fread(&regi, sizeof regi, 1, fp) != 1)
       { /* handle error */ }

   fclose(fp);
}

请记住,如果将文件写入系统并从另一个系统读取,则不能保证将文件写入和读取这样的文件。

答案 1 :(得分:2)

您需要编写结构的大小,而不是指向结构的指针的大小。

 fwrite(regi, sizeof(struct stCrimeArchive), 1, filea);

或者这可能会更清楚:

 fwrite(regi, sizeof(*regi), 1, filea);

答案 2 :(得分:1)

您的fwrite来电错误:

fwrite(regi, sizeof(struct stCrimeArchive*), 1, filea);

你正在将指针传递给要写入的内存是正确的,大小是指针的大小是错误的,而不是你打算写的实际struct的大小。您可能只会将struct开头的4或8个字节写入文件。

sizeof(struct stCrimeArchive*)更改为sizeof(struct stCrimeArchive),与传递给malloc的尺寸相同。

但是,您的代码仍然无法编译,因为没有这样的类型stCrimeArchive(应该是CrimeArchive?)而另一个原因是您尝试分配int到以下行的char[]

regi->id_student = atoi(num);

答案 3 :(得分:0)

while  (fread(&regi, sizeof(struct CrimeArchive), 1, filea))

我认为这种恐惧应该在这里接受无效*但不是无效**。

答案 4 :(得分:0)

很抱歉很晚才回答,但我想知道问题是如何解决的。其中一个答案是正确的,问题是编写结构的大小。

写作过程:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stCrimeArchive {
   char id_student[10];
   int id_document;
   char judgement[30];
   int id_crime;
   char date[12];
   char id_police[12];
};

int main()
{
   struct stCrimeArchive *regi;
   FILE *filea;
   filea = fopen("crimearchives.dat", "r+b");          
   if(!filea) 
 filea = fopen("crimearchives.dat", "w+b");

   int i;
   char num[6];

   regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));

   printf("ID DOCUMENT: ");
   fgets(num, 6, stdin);
   regi->id_document= atoi(num);

   printf("ID STUDENT: ");
   fgets(regi->id_student, 30, stdin);
   for(i = strlen(regi->id_student)-1; i && regi->id_student[i] < ' '; i--)
    regi->id_student[i] = 0;

   printf("CRIME CODE: ");
   fgets(num, 6, stdin);
   regi->id_crime = atoi(num);

   printf("DATE OF THE CRIME: ");
   fgets(regi->date, 30, stdin);
   for(i = strlen(regi->date)-1; i && regi->date[i] < ' '; i--)
    regi->date[i] = 0;   

   printf("ID POLICE: ");
   fgets(regi->id_police, 30, stdin);
   for(i = strlen(regi->id_police)-1; i && regi->id_police[i] < ' '; i--)
    regi->id_police[i] = 0;  

   printf("JUDGEMENT: ");
   fgets(regi->judgement, 30, stdin);
   for(i = strlen(regi->judgement)-1; i && regi->judgement[i] < ' '; i--)
    regi->judgement[i] = 0;     

   fseek(filea, 0, SEEK_END);
   fwrite(regi, sizeof *regi, 1, filea);

   free(regi);
   fclose(filea);
}  

然后,对于阅读过程:

int main()
{ 
   struct stCrimeArchive *regi;
   regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
   FILE *filea;
   filea = fopen("crimearchives.dat", "r+b");          
   if(!filea) 
    filea = fopen("crimearchives.dat", "w+b");
   rewind(filea);
   while  (fread(regi, sizeof *regi, 1, filea))
    printf("%2d %-11s %-11s %8d %-13s %-14s\n", regi->id_document, regi->id_police, regi->date, regi->id_crime, regi->id_student, regi->judgement);
   fclose(filea);
}

我没有更多话要说但是谢谢=)