2013-04-02 46 views
1

ich habe ein seltsames verhalten,wenn ich ein Struktur in einer Datei schreibe。從文件中讀入和讀入結構

如果我寫入文件,員工13和26(以及其他人)總是錯誤的ID2/ID3。 (見輸出)

我在做什麼錯?

非常感謝您的建議。

typedef struct Employee 
{ 
    char name[128]; 
    int ID1; 
    int ID2; 
    int ID3; 
}employee; 


void __fastcall TMainForm::LogHeader(char* filename) 
{ 
    char cBuffer[2048]={0}; 
    FILE *pFile; 
    int n = 0; 
    Employee header; 
    if(FileExists(filename)){ 
     pFile = fopen(filename,"r"); 
     fread(&header,sizeof(struct Employee),1,pFile); 
     fclose(pFile); 
    } 
    memset(cBuffer,sizeof(cBuffer),0); 
    n = 0; 
    n+= sprintf(cBuffer+n,"%s\t",header.name); 
    n+= sprintf(cBuffer+n,"ID1: %d\t",header.ID1); 
    n+= sprintf(cBuffer+n,"ID2: %d\t",header.ID2); 
    n+= sprintf(cBuffer+n,"ID3: %d\t",header.ID3); 
    log(cBuffer); 
} 

void __fastcall TMainForm::Save3Click(TObject *Sender) 
{ 
    FILE *pFile; 
    int iWritten = 0; 
    Employee header; 
    char fn[MAX_PATH]={0}; 
    __int16 *mesauredValues; 
    header.ID1 = 1280; 
    mesauredValues  = new __int16[header.ID1]; 
    for(int i = 1;i<32;i++){ 
     setmem(header.name,sizeof(header.name),0); 
     sprintf(header.name,"employee number: %.2d",i); 
     header.ID2= i; 
     header.ID3= i; 
     sprintf(fn,"D:\\temp\\Testfile_%.4d.dat",i); 
     for(int j = 0;j<header.ID1;j++){mesauredValues[j] = j;} 
     pFile = fopen(fn,"wb"); 
     assert(pFile != NULL); 
     iWritten = fwrite(&header,sizeof(struct Employee),1,pFile); 
     iWritten += fwrite(mesauredValues,sizeof(__int16),header.ID1,pFile); 
     fclose(pFile); 
     LogHeader(fn); 
    } 
    delete mesauredValues; mesauredValues = NULL; 
} 
//--------------------- output: 
employee number: 01 ID1: 1280 ID2: 1 ID3: 1 
employee number: 02 ID1: 1280 ID2: 2 ID3: 2 
employee number: 03 ID1: 1280 ID2: 3 ID3: 3 
employee number: 04 ID1: 1280 ID2: 4 ID3: 4 
employee number: 05 ID1: 1280 ID2: 5 ID3: 5 
employee number: 06 ID1: 1280 ID2: 6 ID3: 6 
employee number: 07 ID1: 1280 ID2: 7 ID3: 7 
employee number: 08 ID1: 1280 ID2: 8 ID3: 8 
employee number: 09 ID1: 1280 ID2: 9 ID3: 9 
employee number: 10 ID1: 1280 ID2: 10 ID3: 10 
employee number: 11 ID1: 1280 ID2: 11 ID3: 11 
employee number: 12 ID1: 1280 ID2: 12 ID3: 12 
employee number: 13 ID1: 1280 ID2: 0 ID3: 0 
employee number: 14 ID1: 1280 ID2: 14 ID3: 14 
employee number: 15 ID1: 1280 ID2: 15 ID3: 15 
employee number: 16 ID1: 1280 ID2: 16 ID3: 16 
employee number: 17 ID1: 1280 ID2: 17 ID3: 17 
employee number: 18 ID1: 1280 ID2: 18 ID3: 18 
employee number: 19 ID1: 1280 ID2: 19 ID3: 19 
employee number: 20 ID1: 1280 ID2: 20 ID3: 20 
employee number: 21 ID1: 1280 ID2: 21 ID3: 21 
employee number: 22 ID1: 1280 ID2: 22 ID3: 22 
employee number: 23 ID1: 1280 ID2: 23 ID3: 23 
employee number: 24 ID1: 1280 ID2: 24 ID3: 24 
employee number: 25 ID1: 1280 ID2: 25 ID3: 25 
employee number: 26 ID1: 1280 ID2: 2089983994 ID3: 0 
employee number: 27 ID1: 1280 ID2: 27 ID3: 27 
employee number: 28 ID1: 1280 ID2: 28 ID3: 28 
+1

'<! - insert rant pro vs. contra __attribute __((packed))below - >' – 2013-04-02 14:03:44

+3

您想使用C還是C++? (Wollen Sie C oder C++ benutzen?) – Beta

+4

作爲一個明顯的出發點,當你打開閱讀時,你可能想使用'rb',因爲當你打開書寫時使用'wb'(但是因爲它是C++,你可能想要消除這兩者,並使用iostreams代替)。 –

回答

1

用「rb」和「wb」打開,這看起來像CTRL-Z(ASCII 26)被解釋爲文件結尾。

+0

謝謝,我不得不閱讀它與「rb」而不是「r」 – user1808707

+0

「r」 - 打開一個現有的文本文件閱讀 「w」 - 創建一個文本文件或打開和截斷現有的文本文件,用於編寫 「a」 - 創建文本文件或打開現有的文本文件,以便寫入。在每次寫入之前,文件位置指示器都位於文件末尾 「rb」 - 打開一個用於讀取 「wb」的現有二進制文件 - 創建二進制文件或打開和截斷現有二進制文件,寫作 – user1808707