2

我正在尝试使用 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。

有人可以告诉我发生了什么事吗?谢谢!

谢谢,

4

1 回答 1

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. 而不是硬编码1024and 1000,你会更好地使用类似的东西,#define BUFFLEN 1024这样你就不会一直重复那些神奇的值。
于 2012-05-18T19:07:00.277 回答