2012-12-09 217 views
-2

假設一個二進制文件(需要打開供讀取)寫這個函數原型:(可以在下面的膏可以找到有關該功能的更多詳細信息)讀取二進制文件:c

void writeBinaryFile (char *fileName , char *comment , int numberOfDoubles , double *doubles , int numberOfInts , int *ints) 

...

我編寫的代碼僅獲得.bin文件的第一個字母...

在這裏,我我的功能:

void readBinaryFile(char *fileName) 
{ 
     FILE *fp; 
     char *ptr; 
     double *ptr1; 
     int *ptr2; 
     ptr=(char*)malloc(sizeof(char)*5); 
     ptr1=(double*)malloc(sizeof(double)*6); 
     ptr2=(int*)malloc(sizeof(int)*6); 

     fp=fopen (fileName , "rb") ; 
     fread(ptr,sizeof(char),11,fp); 
     while(*ptr!='\0') 
     { 
      printf("%c",*ptr); 
      ptr++; 

     } 
     fclose(fp); 
} 

我在這裏錯過了什麼?我需要閱讀的不僅僅是.bin文件中的第一個字符。

一如既往的幫助表示讚賞。謝謝!

在這種情況下任何人需要完整的代碼以有組織的方式,這裏是貼:

http://pastebin.com/66jZwfUD

+4

我注意到你讀了11個字節到分配給5個字節的空間。這當然不會好。 – chrisaycock

+0

這麼多問題......文件實際包含什麼? 'fread()'返回什麼?您發送給'printf()'的字符是否可打印?如果文件是二進制文件,是否可能是第二個字節只是'0',所以你停止嘗試打印字符? –

+2

(1)沒有API返回碼檢查*,(2)三個不同的內存泄漏,(3)在while循環中沒有長度限制以防止進入未分配的堆內存。 (4)將11個字節讀入分配5字節寬=堆損壞全部保證。我確定還有其他人,但是這些都是在60秒內發現的。 – WhozCraig

回答

3
void readBinaryFile(char *fileName) 
{ 
    FILE *fp; 
    char *ptr; 
    double *ptr1; 
    int *ptr2; 

    ptr=(char*)malloc(sizeof(char)*5); 
    ptr1=(double*)malloc(sizeof(double)*6); 
    ptr2=(int*)malloc(sizeof(int)*6); 

不要投malloc C中的返回值它隱藏的錯誤。

fp=fopen (fileName , "rb") ; 

您需要檢查此處的錯誤。

fread(ptr,sizeof(char),11,fp); 

您分配5個字節ptr,現在你正在閱讀11.您還應該檢查的fread返回值。

while(*ptr!='\0') 
    { 
     printf("%c",*ptr); 
     ptr++; 

    } 

有沒有什麼可以防止此循環運行在分配空間的末尾。

fclose(fp); 
} 

現在,你分配的內存泄漏,並且由於指針超出範圍,當你回到你讀入它的數據會丟失。

+1

如果您不遵守C99,所有函數必須在使用之前聲明,則從malloc投射返回值只會隱藏錯誤。然後錯誤是你沒有使用C99。 –