2012-01-04 2 views
4

파일 "file.raw"와 한 번에 4 바이트를 배열로 읽으 려하고 찾고있는 특정 4 바이트 서명이 있는지 확인하려고합니다. 나는 이것에 문제가있다. 결과 값은 fread를 사용할 때 4 대신 0입니다.C에서 fread를 사용하여 파일을 읽을 수 없습니다

#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() 호출하면 (이 ASCII 문자 '0', 'x', 'f''f'의 순서를 찾고 있어요) 원하는 것을 거의 확실하지

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

있다.

추신 : @Mat의 주석에서 언급했듯이 이식성을 극대화하려면 파일을 이진 모드 ("r+" 대신 "r+b")로 열어야합니다.

+0

매우 가능성이 높습니다. 오픈 모드에서 "b"가 부족하면 일부 플랫폼에서도 문제가 될 수 있습니다. – Mat

+0

@aix, 네가 맞다. 감사. memcmp 대신 0xffd8ffe0이 내 파일에 있는지 찾아야합니까? – kevin

+1

@kevin :'memcmp()'는 그다지 문제가 아니며, 두 번째 인수로주는 문자열입니다. 'char header [] = {0xff, 0xd8, 0xff, 0xe0}'줄을 따라 char 배열을 만들고 그것을'memcmp()'호출에서 사용하고 싶을 것이다. – NPE

0

텍스트 모드 ("r+") 대신 이진 모드 ("r+b")로 파일을 열어보십시오. 비 의도적 인 CRLF 변환으로 인해 취소되었을 가능성이 있습니다. 바이너리 데이터가 엉망입니다.

관련 문제