2012-01-04 13 views
4

ファイル "file.raw"と一度に4バイトを配列に読み込み、探している特定の4バイトの署名があるかどうかを確認しようとしています。私はこれに問題があります。私が得た結果の値は、freadを使うときは4でなく、0です。Cでフリーダを使用してファイルを読み取ることができません

#include<stdint.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef uint8_t BYTE; 

int main(void) 
{ 
    size_t result; 
    FILE *inptr = fopen("file.raw","r+"); 
    //Check if file can be opened. 
    if (inptr == NULL) 
    { 
     printf("File Open Error\n"); 
     return -1; 
    } 
    long int x = 0; 

    while(!feof(inptr)) 
    { 
     // Make space for reading in to an array 
     BYTE *array = (BYTE *) malloc(10); 
     if(array == NULL) 
     { 
      printf("Array Initialization Error\n"); 
      return -1; 
     } 

     result = fread(array,1,4,inptr); 
     //Exit if file not read. ** This is where I can't get past. 
     if(result != 4) 
     { 
      printf("File Read Error\n"); 
      printf("%d\n",result); 
      free(array); 
      fclose(inptr); 
      return -1; 
     } 

     //Compare strings 

     if(memcmp(array,"0xffd8ffe0",4)==0) 
     { 
      printf("File Start found\n"); 
      printf("Exiting...\n"); 
      printf("%p\n",inptr); 
      free(array); 
      fclose(inptr); 
      return 0; 
     } 
     x++; 
     free(array); 
    } 

    printf("%p\n",inptr); 
    printf("%ld\n",x); 
    fclose(inptr); 
    return 0; 
} 
+0

'ferror(inptr)はあなたに何を与えるのですか? –

+1

'feof()'と 'ferror()'を調べて原因を特定してください:EOFか読み込み失敗です。読み込みエラーが発生した場合は、エラー理由を得るために 'errno'をチェックします。 – hmjd

+0

'while(!feof(inptr))'も完全に壊れています。 'feof'は意味があります** **読み込み操作が完了した後に... –

答えて

4

私の推測では、それはwhileループの最初の反復で失敗しないということですが、むしろあなたはどの時点fread() 0を返すと、あなたのプログラムが終了時に、ファイルの終わりに達するまで、ファイルを読み込み続けます。

それが署名を見つけていない理由はこれです:

memcmp(array,"0xffd8ffe0",4)==0 

memcmp()呼び出しは、あなたが(それはASCII文字'0''x''f''f'のシーケンスを探して)欲しいものはほぼ確実ではないこと。

PSコメントの@Matで述べたように、移植性を最大限に高めるために、ファイルをバイナリモード("r+"の代わりに"r+b")で開く必要があります。

+0

非常に可能性が高いです。オープンモードでの "b"の欠如は、一部のプラットフォームでも問題になる可能性があります。 – Mat

+0

@aix、あなたは正しいです。ありがとう。 0xffd8ffe0が私のファイルにあるかどうかを見つけるためにmemcmpの代わりに何を使うべきですか? – kevin

+1

@kevin: 'memcmp()'自体は問題ではなく、2番目の引数として与える文字列です。おそらく 'char header [] = {0xff、0xd8、0xff、0xe0}'の行に沿ってchar配列を作成し、それを 'memcmp()'呼び出しで使いたいと思うでしょう。 – NPE

0

テキストモード("r+")の代わりにバイナリモード("r+b")でファイルを開いてみてください。あなたはおそらく意図しないCRLF変換によって元に戻され、バイナリデータを混乱させるでしょう。