【发布时间】: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 page,read在错误时返回-1,而不是基于not-> 0的东西。您应该检查-1返回值,然后检查errno。 -
关于
> 0条件,这是非常 有问题的,因为bytes是一个无符号 整数。考虑two's complement 系统中-1的无符号等价物。如果你看到例如thisreadreference 你会看到它返回了一个ssize_t类型的值,它是有符号的。 -
@jww 除此之外,
> 0是一个好的条件。如果出现错误或文件结束,循环将结束。 -
很好地抓住了那个无符号整数。但是,经过测试, read() 肯定不会返回 -1。它返回 0。再做一点挖掘,似乎读取停止在 substitute character 上,该字符在 ascii 表中的十六进制值为 1A。