2013-03-02 98 views
0

我想从.dat文件读取结构... 要读取的第一个整数是读数的数量 然后存在以下结构格式的数据阅读C文件中的.dat文件缺失/重复记录

struct Oven 
{ 
int rec_no; 
int temp; 
int status; 
char string[10]; 
}; 
下面

是通过我读的文件

int read_and_process_file() 
{ 
    int counter; 
    FILE *ptr_myfile; 
    struct Oven my_record; 

    ptr_myfile=fopen("data.dat","rt"); 

    //for no of readings 
    fread(&no_of_readings,sizeof(no_of_readings),1,ptr_myfile); 


     for (counter=1; counter <= 50; counter++) 
     { 
       fread(&my_record,sizeof(struct Oven),1,ptr_myfile); 

      name=my_record.string; 

      printf("%d : ",my_record.rec_no); 
      fprintf(ptr_myfile2,"%d : ",my_record.rec_no); 
      printf("%d : ",my_record.temp); 
      printf("%d : ",my_record.status); 
      printf("%s\n",name); 
     } 

    fclose(ptr_myfile); 
    return 0; 
} 

的方法,但我无法读取超过25条记录25后,不断重复25记录...

尝试fseek,但它跳过一些记录...任何帮助?

这是输出图像

UPDATE(Wildplasser)这里是第一个在0x200字节的数据(不至极看起来有点不规则...)

00000000 b8 0b 00 00 00 00 00 00 54 00 00 00 01 00 00 00 |........T.......| 
00000010 42 6f 62 00 cd cd cd cd cd cd cd cd 01 00 00 00 |Bob.............| 
00000020 4d 00 00 00 00 00 00 00 43 4c 4f 53 45 44 00 cd |M.......CLOSED..| 
00000030 cd cd cd cd 02 00 00 00 2e 00 00 00 00 00 00 00 |................| 
00000040 43 4c 4f 53 45 44 00 cd cd cd cd cd 03 00 00 00 |CLOSED..........| 
00000050 5f 00 00 00 01 00 00 00 48 61 72 72 79 00 cd cd |_.......Harry...| 
00000060 cd cd cd cd 04 00 00 00 44 00 00 00 01 00 00 00 |........D.......| 
00000070 48 61 72 72 79 00 cd cd cd cd cd cd 05 00 00 00 |Harry...........| 
00000080 63 00 00 00 01 00 00 00 4a 69 6c 6c 00 cd cd cd |c.......Jill....| 
00000090 cd cd cd cd 06 00 00 00 53 00 00 00 01 00 00 00 |........S.......| 
000000a0 4a 61 6d 65 73 00 cd cd cd cd cd cd 07 00 00 00 |James...........| 
000000b0 56 00 00 00 00 00 00 00 43 4c 4f 53 45 44 00 cd |V.......CLOSED..| 
000000c0 cd cd cd cd 08 00 00 00 49 00 00 00 00 00 00 00 |........I.......| 
000000d0 43 4c 4f 53 45 44 00 cd cd cd cd cd 09 00 00 00 |CLOSED..........| 
000000e0 53 00 00 00 01 00 00 00 42 6f 62 00 cd cd cd cd |S.......Bob.....| 
000000f0 cd cd cd cd 0d 0a 00 00 00 59 00 00 00 00 00 00 |.........Y......| 
00000100 00 43 4c 4f 53 45 44 00 cd cd cd cd cd 0b 00 00 |.CLOSED.........| 
00000110 00 46 00 00 00 01 00 00 00 4a 69 6c 6c 00 cd cd |.F.......Jill...| 
00000120 cd cd cd cd cd 0c 00 00 00 38 00 00 00 00 00 00 |.........8......| 
00000130 00 43 4c 4f 53 45 44 00 cd cd cd cd cd 0d 00 00 |.CLOSED.........| 
00000140 00 48 00 00 00 00 00 00 00 43 4c 4f 53 45 44 00 |.H.......CLOSED.| 
00000150 cd cd cd cd cd 0e 00 00 00 5e 00 00 00 01 00 00 |.........^......| 
00000160 00 4a 61 6d 65 73 00 cd cd cd cd cd cd 0f 00 00 |.James..........| 
00000170 00 40 00 00 00 01 00 00 00 4a 69 6c 6c 00 cd cd |[email protected]| 
00000180 cd cd cd cd cd 10 00 00 00 56 00 00 00 00 00 00 |.........V......| 
00000190 00 43 4c 4f 53 45 44 00 cd cd cd cd cd 11 00 00 |.CLOSED.........| 
000001a0 00 43 00 00 00 01 00 00 00 4a 61 6d 65 73 00 cd |.C.......James..| 
000001b0 cd cd cd cd cd 12 00 00 00 60 00 00 00 01 00 00 |.........`......| 
000001c0 00 42 6f 62 00 cd cd cd cd cd cd cd cd 13 00 00 |.Bob............| 
000001d0 00 5e 00 00 00 00 00 00 00 43 4c 4f 53 45 44 00 |.^.......CLOSED.| 
000001e0 cd cd cd cd cd 14 00 00 00 55 00 00 00 00 00 00 |.........U......| 
000001f0 00 43 4c 4f 53 45 44 00 cd cd cd cd cd 15 00 00 |.CLOSED.........| 
+0

理念和使用计数器固定为50.您的输入文件是否有超过25条记录?您也不检查文件操作的返回代码是否有错误。 – daven11 2013-03-02 11:58:46

+0

是的我最初有3000条记录我想检查前50条记录,检查fread我得到0后25记录,但我有超过25 .. – fzkhan 2013-03-02 12:48:37

+0

我加了hexdump到OQ。从这个hexdump中可以清楚的看出,在Bob之后有一个CRLF对。该文件可能已通过FTP以ASCII模式传输,甚至更糟:由BillyBoyGatesEditor编辑。 – wildplasser 2013-03-03 12:04:20

回答

0

由于代码片段不完整,很难准确判断发生了什么,但这里有一些我注意到的事情:

  • 您似乎没有使用read-in no_of_readings,而是尝试读取50条记录。既然你没有检查fread的返回值,你的程序会继续使用最后一次成功的fread读取。

  • 如果您没有阅读文本,您不应该在文本模式下打开文件。行结束转换可能会破坏您的数据。使用“rb”代替(也是在文本模式下打开的标准C方式只是省略b,t是非标准的)。

  • 编辑:在Windows上以文本模式读取文件时将ctrl-z字节(26)解释为文件结尾。这就是为什么你的阅读在第25条记录后停止。

  • 直接从/从这样的结构读取/写入数据将导致不可移植的数据文件。更好地将您的结构串行化为手动字节。

+0

阅读文件后,我只想读取50条记录no_of_readings = 3000,所以我没有使用它。使用来自fread的返回值,我在第25条记录后得到0,这意味着fread没有超过25的记录,为什么? – fzkhan 2013-03-02 12:42:02

+0

如果我使用rb而不是rt我只能得到正确的前10条记录 – fzkhan 2013-03-02 12:45:07

+0

可以请你手动添加一些关于序列化结构的更多信息? – fzkhan 2013-03-02 12:46:10

0

我建议检查的fread的返回值来检查错误

 int size = fread(&my_record,sizeof(struct Oven),1,ptr_myfile); 
     if (size != sizeof(struct Oven)) 
     { 
      perror ("Error reading Line %d", counter); 
      break; 
     } 

这应该给你似乎在no_of_readings阅读则忽略它的什么地方出了错