当我运行我的代码读取文件时,它可以在任何方面工作。我在文件中找到的任何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;
}
1条答案
按热度按时间o7jaxewo1#
返回EOF的可能性是
istream::get
不返回char
而是返回更广泛的整数类型的主要原因。如果EOF返回为
0
,则无法将其与非EOF0
区分开。EOF
的值是流的char特性的一部分,可以在std::char_traits<CharT>
中找到它。由于它的所有模板和没有具体的
CharT
在文档中提到,它可以是繁琐的涉水通过。这个网站作为一个非常方便的概述,也列出了char_traits<char>
的最重要的功能:https://en.cppreference.com/w/cpp/string/char_traits .最后,EOF被指定为负数,并且一旦被环绕,您就无法区分“好”值和EOF之间的区别。因此,您不应该使用
uint8_t
作为get
的返回值。使用适当的整数类型,并且只有在检查EOF之后,您才可以将其存储为目标类型。