2012-05-18 127 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

事实上,您的程序确实正在读取整个文件。它一次读取1000个字节的文件,直到有736个字节。然后它读取最后的736字节,并且read返回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); 

几个其他点:

  1. 的正确类型rsize_t
  2. 而不是硬编码10241000,你会更喜欢#define BUFFLEN 1024之类的东西,这样你就不会重复这些魔法值。