2012-05-18 4 views
2

MinGW에서 컴파일 한 프로그램으로 Windows 7에서 이진 파일을 읽으려고합니다. 이진 파일 크기는 ~ 10M이지만 프로그램은 1000 바이트 미만을 읽을 수 있으며 EOF에 도달했다고 생각합니다.MinGW : 이진 데이터 읽기 실패

다음은 코드입니다. 나는 바보 같은 짓을하고 있다고 확신하지만 나는 그것을 찾지 못하는 것 같습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

#define TS_FILE "foo.data" 

int main(void) 
{ 
    int fd; 
    int r; 
    unsigned char buf[1024]; 

    fd = open(TS_FILE, O_RDONLY|O_BINARY); 
    printf("fd: %d\n", fd); 

    if (fd == -1) 
    { 
     exit(0); 
    } 

    for (;;) 
    { 
     r = read(fd, buf, 1000); 
     if (r != 1000) 
     { 
      printf("read error. %d\n", r); 
      perror("read"); 
     } 

     if (r == 0) 
     { 
      break; 
     } 
    } 
    close(fd); 
} 

프로그램에서 736 바이트를 읽으면 EOF가됩니다.

누군가 무슨 일이 일어나는지 말해 줄 수 있습니까? 감사!

감사합니다.

답변

1

실제로 프로그램이 실제로 전체 파일을 읽습니다. 이 경우 736 바이트가 남을 때까지 한 번에 1000 바이트의 파일을 읽습니다. 그런 다음 최종 736 바이트를 읽고 은 736을 반환합니다. 오류로 전체 1000 바이트를 읽을 수 없기 때문에 실수로 처리하지만 오류는 아닙니다. read이 실패하면 오류 조건은 리턴 값 -1로 표시됩니다.

루프는 아마도 더 같이해야한다 :

for (;;) 
{ 
    r = read(fd, buf, 1000); 
    if (r == -1) 
    { 
     printf("read error\n"); 
     perror("read"); 
     exit(1); 
    } 

    if (r != 1000) 
    { 
     //entire file has been read 
     break; 
    } 
} 
close(fd); 

다른 점 몇 : r에 대한

  1. 올바른 유형 size_t입니다.
  2. 10241000을 하드 코딩하는 대신 이러한 마법 값을 계속 반복하지 않도록 #define BUFFLEN 1024과 같은 것이 좋습니다.