在 C++ 中读取空文件返回 255,预期为 0

Reading empty file in C++ returns 255, 0 expected

提问人:GabrijelOkorn 提问时间:12/9/2022 更新时间:12/9/2022 访问量:155

问:

当我运行代码来读取文件时,它以各种方式工作。我在文件中找到的任何 ASCII 代码都可以使用我的函数打印出来。但是当它到达 EOF 时,我希望它返回 0,但它返回 255。为什么会发生这种情况,我该如何解决。
我的代码部分:

uint8_t FileDevice::read () {
    ifile.open(this->fileName);
    if (!ifile) ifile.open(this->fileName.c_str(), ifstream::app);
    ifile.seekg(this->position);
    uint8_t character;
    character = ifile.get();
    ifile.close();
    this->position++;
    printf("%d\n", character);
    return character;
}
C++ 读取文件 EOF

评论

4赞 molbdnilo 12/9/2022
为什么你期望返回 0?它返回一个更宽的整数类型,以便能够返回一个“无效”的值。get
0赞 Peter - Reinstate Monica 12/9/2022
@molbdnilo 就上下文而言,可以说这个想法最初来自 C 标准库。它非常优雅:否则如何传达 EOF?抛出异常将是糟糕的设计,因为EOF并不是真正出乎意料的,恰恰相反(尽管可能会引发真正的I/O错误)。唯一的替代方法是交出引用或指针并返回诊断值,à la scanf。

答:

3赞 463035818_is_not_an_ai 12/9/2022 #1

返回 EOF 的可能性是 istream::get 不返回 a 而是返回更宽的整数类型的主要原因。char

如果 EOF 将被退回,因为您将无法将其从非 EOF 中分离出来。00

的值是流的 char 特征的一部分。你可以在这里找到它 std::char_traits<CharT>.EOF

由于它的所有模板都没有在文档中提及,因此浏览起来可能很麻烦。这个网站作为一个非常方便的概述,还列出了最重要的功能:https://en.cppreference.com/w/cpp/string/char_traitsCharTchar_traits<char>

最后但并非最不重要的一点是,EOF 被指定为负值,一旦被包裹起来,您就无法分辨“良好”值和 EOF 之间的区别。因此,您不应用于 的返回值。使用适当的整数类型,只有在检查 EOF 后,才能将其存储为目标类型。uint8_tget

评论

0赞 GabrijelOkorn 12/9/2022
我现在明白你在说什么并理解它,谢谢。我想问为什么它不返回 acutual 值“0x00”,这是文本文件中最后一个字节的代码。我才发现我测试的文件被腐蚀了。泰
0赞 463035818_is_not_an_ai 12/9/2022
@GabrijelOkorn你说你读取的文件是空的。还是不是空的?
0赞 GabrijelOkorn 12/9/2022
命令 hexdump <file> 说它什么都没有。
0赞 GabrijelOkorn 12/9/2022
这是我希望从中读取“00”的文件示例:hexdump FA.dev 0000000 2031 2032 0a33 0a39 0a32 000000a
1赞 Peter - Reinstate Monica 12/9/2022
@GabrijelOkorn 空字节不表示文件结束,无论是在 DOS/WIndows(那里是 26,对应于 Ctrl-Z)还是在 Unix(那里是 4,Ctrl-D)中。空字节表示内存中字符串的结尾。典型的文本文件将不包含这三个字符中的任何一个(文件结束条件从文件系统传达给程序)。然后,I/O 例程有自己的方式将其传达给用户——例如,格式化的输入将在流对象中设置一个标志,将其转换为布尔值会突然产生 false。