提问人:GabrijelOkorn 提问时间:12/9/2022 更新时间:12/9/2022 访问量:155
在 C++ 中读取空文件返回 255,预期为 0
Reading empty file in C++ returns 255, 0 expected
问:
当我运行代码来读取文件时,它以各种方式工作。我在文件中找到的任何 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;
}
答:
3赞
463035818_is_not_an_ai
12/9/2022
#1
返回 EOF 的可能性是 istream::get
不返回 a 而是返回更宽的整数类型的主要原因。char
如果 EOF 将被退回,因为您将无法将其从非 EOF 中分离出来。0
0
的值是流的 char 特征的一部分。你可以在这里找到它 std::char_traits<CharT>
.EOF
由于它的所有模板都没有在文档中提及,因此浏览起来可能很麻烦。这个网站作为一个非常方便的概述,还列出了最重要的功能:https://en.cppreference.com/w/cpp/string/char_traits。CharT
char_traits<char>
最后但并非最不重要的一点是,EOF 被指定为负值,一旦被包裹起来,您就无法分辨“良好”值和 EOF 之间的区别。因此,您不应用于 的返回值。使用适当的整数类型,只有在检查 EOF 后,才能将其存储为目标类型。uint8_t
get
评论
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。
评论
get