【问题标题】:Program Not Reading Entire File程序未读取整个文件
【发布时间】:2019-10-02 03:09:58
【问题描述】:

我正在用 C 编写一个十六进制转储程序。我知道那里有大量的十六进制转储程序,但我想写一个来体验一下。我已经在 Windows 上的 CodeBlocks 中编写了程序,但我似乎无法让它工作。

我正在读取大约 137,000 字节的测试程序,但程序在 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;
}

【问题讨论】:

  • 另外,我会提到我已经尝试了多个文件,当我在 Windows 上时,我似乎都遇到了问题。但是,在 Linux 上仍然没有问题。谢谢!
  • 根据read (3) man pageread 在错误时返回-1,而不是基于not-> 0 的东西。您应该检查 -1 返回值,然后检查 errno
  • 关于> 0 条件,这是非常 有问题的,因为bytes 是一个无符号 整数。考虑two's complement 系统中-1 的无符号等价物。如果你看到例如this read reference 你会看到它返回了一个ssize_t 类型的值,它是有符号的。
  • @jww 除此之外,> 0 是一个好的条件。如果出现错误或文件结束,循环将结束。
  • 很好地抓住了那个无符号整数。但是,经过测试, read() 肯定不会返回 -1。它返回 0。再做一点挖掘,似乎读取停止在 substitute character 上,该字符在 ascii 表中的十六进制值为 1A。

标签: c linux windows io


【解决方案1】:

毕竟我已经在这篇文章中找到了答案。不过,他们遇到了标准输入问题。显然替代字符 (1A) 与 Windows 中的 CTRL+Z 相同,因此在读取该字符时它会强制关闭我的程序。

C reading (from stdin) stops at 0x1a character

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多