2014-10-03 1 views
1

파일에서 16 진수 출력을 생성하는 간단한 프로그램을 작성하려고합니다. 16 진수 형식의 파일 가져 오기 - 내 출력 대 xxd 명령 출력

gcc -std=c99 -Wall -Wextra -pedantic-errors two.c -o two 

그래서 난 two 실행 파일이이 방법으로 컴파일 된

#include <stdio.h> 

int 
main(void) { 
    printf("%s\n", "Hello"); 
    return 0; 
} 

: 이것은 내 two.c 파일입니다.

이제 파일을 읽고 이진 (16 진수) 출력을 표시하는 프로그램을 작성했습니다. 이것은 내 프로그램입니다 :

#include <stdio.h> 

int 
fileSize(FILE *ptr) { 

    int size = 0; 
    fseek(ptr, 0, SEEK_END); 
    size = ftell(ptr); 
    fseek(ptr, 0, SEEK_SET); 
    return size; 

} 

int 
main(void) { 

    FILE *fp; 
    fp = fopen("two", "rb"); 
    int sz = fileSize(fp); 
    char buff[ sz ]; 

    if (!fp) 
     printf("%s\n", "Not great at all"); 

    else 
     while (!feof(fp)) { 
      fgets(buff, sz, fp); 
      for (int i = 0; i < sz; i++) { 
       printf("%02x%02x ", (buff[i] & 0xFF), (buff[i+1] & 0xFF)); 
       if (!(i % 8)) 
        printf("\n"); 
      } 
      printf("\n"); 
     } 

    fclose(fp); 

} 

그리고 여기의 엄청난 출력 http://pastebin.com/RVLy6H9B

문제는, 내가 (이 형식에 대한 아니라) 완전히 다른 결과를 얻고있다거야 리눅스 명령 xxd two > two.hex을 사용할 때 단지 약 500 줄의 바이트가 아니라 내 출력과 같은 약 8k.

xxd 출력 : http://pastebin.com/Gw9wg93g

문제가? 독서 기능에 문제가 있습니까? fgets(buff, sz, fp);?

+0

여기'fp = fopen ("two", "rb");'어떤 파일을'two.c'또는'two.o'로 여는가? – Rustam

+0

gcc 컴파일 결과물 인'two' 파일을 열었습니다. – python

+2

.... 그리고 ['while (! feof (fp))'** 잘못된 **] (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) – WhozCraig

답변

2

fgets()은 EOF 또는 개행 후에 읽는 것을 중지합니다. 하지만 코드는 항상 sz 번 반복됩니다.

fgets()은 바이너리 데이터를 읽는 올바른 기능이 아닙니다. 대신 fread()을 사용할 수 있습니다.

+0

내 추측이 맞았 어, 고마워. 나는 대신 fread()를 사용할 것이다. – python

+0

@python : 또한 전체 파일을 한 번에 읽을 필요가 없습니다. 한번에 BUFSIZ 바이트를 읽을 수 있습니다. – jfs

+0

예, 알고 있습니다. 나는 독서가 어떻게 작동 하는지를보고 싶었다. :) – python