2012-10-09 104 views
2

我的目標是從二進制文件中讀取超過一百個「序列」(非技術術語),每個包含一個char1(要跟隨的字符串的長度) ,string1,char2,string2。這裏關鍵的東西似乎是動態內存分配,指針和循環。這是我的做法:帶有多個字符串和字符的C/C++二進制文件讀取

char *ColumnNameLength = (char *) malloc(Repetitions * sizeof(char)); 
char *DataTypeLength = (char *) malloc(Repetitions * sizeof(char)); 
char **ColumnName = (char **) malloc(Repetitions * sizeof(char)); 
char **DataType = (char **) malloc(Repetitions * sizeof(char)); 

for (int ctr = 0; ctr <= Repetitions ; ColumnNameLength[ctr] = DataTypeLength[ctr] = NULL, ctr++) 
    ; 
for (int ctr = 0; ctr <= Repetitions ; *(ColumnName+ctr) = DataType[ctr] = NULL, ctr++) 
    ; 

for (int ctr = 0; ctr <= FieldCount; ctr++) 
{ 
    fread((ColumnNameLength + ctr), sizeof(char), 1, pInfile); 

    *(ColumnName + ctr) = (char *) malloc(ColumnNameLength[ctr] * sizeof(char)); 
    fread(ColumnName[ctr], sizeof(char), ColumnNameLength[ctr], pInfile); 
    //I should add '\0' at the end of each read string, but no idea how 

    fread((DataTypeLength + ctr), sizeof(char), 1, pInfile); 

    *(DataType + ctr) = (char *) malloc(DataTypeLength[ctr] * sizeof(char)); 
    fread(&DataType[ctr], sizeof(char), DataTypeLength[ctr], pInfile); 
    //I should add '\0' at the end of each read string, but no idea how 

} 

不幸的是,這不起作用,我甚至不知道要開始調試。任何意見將不勝感激。

+1

建議:選擇「C++」或「C」。 –

+0

我會記住這一點,歡呼。 –

回答

1
  • 確保使用sizeof(char*)而不是sizeof(char)分配字符串數組。
  • 或許使用unsigned char作爲長度,以避免標誌混淆。
  • 爲尾隨分配一個字符'\0'
  • 使用ColumnName[ctr][ColumnNameLength[ctr]] = '\0'添加尾隨空字節。
  • 添加一些錯誤檢查,以防malloc返回NULL
  • 添加錯誤檢查的情況下fread返回長度以外的東西。
  • 在未來的問題中,要更具體地說明實際失敗的原因。
+0

非常感謝。現在我覺得我正在某個地方。 –

0
char *ColumnNameLength = (char *) malloc(Repetitions * sizeof(char)); 
char *DataTypeLength = (char *) malloc(Repetitions * sizeof(char)); 
char **ColumnName = (char **) malloc(Repetitions * sizeof(char*)); 
char **DataType = (char **) malloc(Repetitions * sizeof(char*)); 

for (int ctr = 0; ctr <= Repetitions ; ColumnNameLength[ctr] = DataTypeLength[ctr] = NULL, ctr++) 
    ; 
for (int ctr = 0; ctr <= Repetitions ; ColumnName[ctr] = DataType[ctr] = NULL, ctr++) 
    ; 

for (int ctr = 0; ctr <= FieldCount; ctr++) 
{ 
    fread((ColumnNameLength + ctr), sizeof(char), 1, pInfile); 

    ColumnName[ctr] = (char *) malloc((ColumnNameLength[ctr]+1) * sizeof(char)); 
    fread(ColumnName[ctr], sizeof(char), ColumnNameLength[ctr], pInfile); 
    //I should add '\0' at the end of each read string, but no idea how 
    ColumnName[ctr][ColumnNameLength[ctr]] = '\0'; 

    fread((DataTypeLength + ctr), sizeof(char), 1, pInfile); 

    DataType[ctr] = (char *) malloc((DataTypeLength[ctr]+1) * sizeof(char)); 
    fread(DataType[ctr], sizeof(char), DataTypeLength[ctr], pInfile); 
    //I should add '\0' at the end of each read string, but no idea how 
    DataType[ctr][DataTypeLength[ctr]] = '\0'; 

} 
+0

爲節省我應用上述註釋的麻煩而歡呼;)它編譯得很好 –

1

第一個錯誤我在你的代碼中看到正在使用< =代替<,你必須ColumnNameLength字符走了過來,因此從指數0至指數ColumnNameLength -1

對我來說,你正在使用指向指針的指針而不是使用char數組來保存字符串,這很奇怪。

+0

指針指針是C中常用的一種方法來保存動態數組字符串。 –

+0

也許我沒有注意他的意思,但如果他的意思是字符串數組,那麼它應該是指針的指針。 – Xee

+0

'char ** ColumnName' _is_指針的指針。正如'char ** DataType' –

相關問題