我正在尝试使用MinGW编译的程序在Windows 7上读取二进制文件。二进制文件的大小约为10M,但我的程序只能读取少于1000个字节并认为它已达到EOF。
这是代码。我确定我做的事情很愚蠢,但我似乎无法找到它。
#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。
有人可以告诉我发生了什么事吗?谢谢!
谢谢,
答案 0 :(得分: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);
其他几点:
r
的正确类型为size_t
。1024
和1000
进行硬编码,而是使用#define BUFFLEN 1024
这样的内容会更好,这样就不会重复这些神奇的值。