2013-03-02 65 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閱讀則忽略它的什麼地方出了錯