C 程序无法读取整个文件

C 程序无法读取整个文件,c,linux,windows,io,C,Linux,Windows,Io,我正在用C写一个十六进制转储程序。我知道有很多十六进制转储程序,但我想写一个来体验一下。我已经在Windows上用代码块编写了这个程序,但我似乎无法让它工作 我正在读一个大约137000字节的测试程序,但程序停止在417字节。现在,当我在Linux上编译代码时(因为它只是一个控制台应用程序,并且使用标准的C库),它可以完美地工作,并返回文件中正确的字节数。有人知道为什么read()在Windows上不工作,但在Linux上却工作得很好吗 下面是我如何读取文件的示例 int main(int ar

我正在用C写一个十六进制转储程序。我知道有很多十六进制转储程序,但我想写一个来体验一下。我已经在Windows上用代码块编写了这个程序,但我似乎无法让它工作

我正在读一个大约137000字节的测试程序,但程序停止在417字节。现在,当我在Linux上编译代码时(因为它只是一个控制台应用程序,并且使用标准的C库),它可以完美地工作,并返回文件中正确的字节数。有人知道为什么read()在Windows上不工作,但在Linux上却工作得很好吗

下面是我如何读取文件的示例

int main(int argc, char **argv)
{
    if (argc != 2) { return 1; }

    int fd = open(argv[1], O_RDONLY);
    if (fd == -1) { return 1; }

    unsigned char buffer[8];
    unsigned int bytes = 0;
    unsigned int total_bytes = 0;

    while ((bytes = read(fd, buffer, sizeof(unsigned char) * 8)) > 0) {
        ...
        total_bytes += bytes;
    }

    printf("Total Bytes: %d\n", total_bytes);

    return 0;
}

毕竟,我在这篇文章中找到了答案。不过,他们对stdin有意见。显然,替换字符(1A)与Windows中的CTRL+Z相同,因此它在读取该字符时强制关闭了我的程序


另外,我要提到的是,我尝试了多个文件,在Windows上时,所有这些文件似乎都有问题。不过,在Linux上仍然没有问题。谢谢根据read返回错误时的
-1
,而不是基于not-
>0
的内容。您应该检查
-1
返回值,然后检查
errno
。关于
>0
条件,这是非常有问题的,因为
字节
是无符号整数。考虑系统中的<代码> -1 < /代码>的无符号等价项。如果您看到,例如,您将看到它返回一个类型为
ssize\t
的值,该值是有符号的。@jww除此之外,
>0
是一个正常条件。如果出现错误或文件结尾,循环将结束。该无符号int的捕获效果良好。但是,测试后,read()肯定不会返回-1。它正在返回0。再深入一点,似乎读取停止在替换字符上,ascii表中的十六进制值为1A。