2012-01-04 2 views
4

Я пытаюсь прочитать файл «file.raw» и по 4 байта за один раз в массив и проверить, есть ли у него конкретная 4-байтовая подпись, которую я ищу. У меня проблемы с этим. Значение результата, которое я получаю, равно 0, вместо 4 при использовании fread.Невозможно прочитать файл, используя fread в 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+b" вместо "r+").

+0

Очень вероятно. Отсутствие «b» в открытом режиме может быть проблематичным и на некоторых платформах. – Mat

+0

@aix, Вы правы. Благодарю. Что следует использовать вместо memcmp, чтобы найти, если 0xffd8ffe0 в моем файле? – kevin

+1

@kevin: 'memcmp()' per se не проблема, это строка, которую вы даете в качестве второго аргумента. Вероятно, вы захотите создать массив символов по строкам 'char header [] = {0xff, 0xd8, 0xff, 0xe0}' и использовать его в вызове 'memcmp()'. – NPE

0

Попробуйте открыть файл в двоичном режиме ("r+b") вместо текстового режима ("r+"). Вероятно, вы отменили непреднамеренные конверсии CRLF, испортив свои двоичные данные.

Смежные вопросы