C fread()一个结构

时间:2015-10-20 17:17:44

标签: c struct fread

我工作了2个小时,我在Google上搜索,但答案没有到,所以我问你!希望在某人的帮助下。当我尝试打印我的结构时,我只得到一个结构空(结构被正确创建,填充并存储在文件中)

我的结构是这样的:

 typedef struct
 {
    int serial_number;
    char name [20]; 
    char surname [20]; 
    char sex[1];
    int dd;
    int mm;
    int yyyy; 

} Person;

这是print_file函数

int print_file()
{
   FILE *f;

   f = fopen("civil_registry.dat", "rb");

   if (!f)
   {
       error("Error on opening file, should be missing!");
       return 1;
   }

   Person *tmp;

   tmp = malloc(sizeof(Person));

   fseek(f, 0, SEEK_END);
   int length_of_file = ftell(f);

   while(length_of_file)
   { 
       fread(tmp, sizeof(Person), 1, f);

       print(tmp);

       length_of_file = length_of_file - 64; 
   }

   fclose(f);

   return 0;
}

这里打印功能正常(我认为):

int print(Person *tmp)
{ 
    printf("\n\nSerial Number: %i", tmp->serial_number);
    printf("\nName: %s", tmp->name); 
    printf("\nSurname: %s", tmp->surname);
    printf("\nSex: %s", tmp->sex);
    printf("\nDay: %i", tmp->dd);
    printf("\nMonth: %i", tmp->mm);
    printf("\nYear: %i", tmp->yyyy); 

    return 0;
}

2 个答案:

答案 0 :(得分:1)

代码中有未定义的行为

char sex[1] ;     

在函数print -

printf("\nSex: %s", tmp->sex);       //  %s would expect a null terminated string 

如果您在sex中输入字符,则'\0'没有空格。

因此将其大小增加到char sex[2]

答案 1 :(得分:0)

@ameyCU 所以,我解决了你发布的所有问题!但是我无法正确读取二进制文件,因为我将64字节写入64字节,而我的输出是struct,所有值都为0或NULL