触发 EOF 时调用 unget
Calling unget when EOF is triggered
我正在从 ifstream 中读取字符,如果这些字符不符合特定条件,那么我 unget() 的次数等于这些字符。在我到达文件末尾之前,这一切都很好。然后如果我尝试 unget(),好的位设置为 0。
这意味着没有字符是未读出的,当我再次阅读时,我得到的是空白字符。如果我到达EOF,我怎么能没有正确地取消?
谢谢:)
编辑:
我试图用 putback()
替换我的 unget()
,但是没有,我遇到了一些错误,而不是放回字符,它似乎覆盖了 ifstream 中的字符。这是我使用的代码:
if (substr.length() > 0)
{
for (int i = substr.length()-1; i >= 0; --i)
{
std::cout << "at " << i << ": " << substr.at(i) << " ";
infile.putback(substr.at(i));
}
}
其中 substr
是要放回到流中的字符串。我把它倒序放回去了,所以下次按正确的顺序读取。
如果流中接下来有以下字符串“, r1”,我将“#1”放回流中。回退后,我希望它将接下来的 5 个字符读作“#1,”,但它读作“#r1”...某处“1,”被覆盖了。
EDIT/SOLVED:
我没有使用 unget()
或 putback()
,而是使用 seekg()
和 tellg()
。我用tellg()
存储起始位置,然后读取任意多个字符,找到匹配的字符串并返回到起始位置+匹配字符串的长度。
首先,您需要确保未设置 iostate
位(fail
、bad
或 eof
。在 C++11 中 eof
位将在调用 unget
.
之前自动清除)
然后查看运行后的stram状态。如果设置了 failbit,那么你忘记在调用 unget
之前清除流状态。如果设置了 badbit
,则存在内部错误。可能流不能再支持了。
你不能保证你甚至可以取消一个字符,不像 putback
,库应该支持放回至少一个字符。
我正在从 ifstream 中读取字符,如果这些字符不符合特定条件,那么我 unget() 的次数等于这些字符。在我到达文件末尾之前,这一切都很好。然后如果我尝试 unget(),好的位设置为 0。
这意味着没有字符是未读出的,当我再次阅读时,我得到的是空白字符。如果我到达EOF,我怎么能没有正确地取消?
谢谢:)
编辑:
我试图用 putback()
替换我的 unget()
,但是没有,我遇到了一些错误,而不是放回字符,它似乎覆盖了 ifstream 中的字符。这是我使用的代码:
if (substr.length() > 0)
{
for (int i = substr.length()-1; i >= 0; --i)
{
std::cout << "at " << i << ": " << substr.at(i) << " ";
infile.putback(substr.at(i));
}
}
其中 substr
是要放回到流中的字符串。我把它倒序放回去了,所以下次按正确的顺序读取。
如果流中接下来有以下字符串“, r1”,我将“#1”放回流中。回退后,我希望它将接下来的 5 个字符读作“#1,”,但它读作“#r1”...某处“1,”被覆盖了。
EDIT/SOLVED:
我没有使用 unget()
或 putback()
,而是使用 seekg()
和 tellg()
。我用tellg()
存储起始位置,然后读取任意多个字符,找到匹配的字符串并返回到起始位置+匹配字符串的长度。
首先,您需要确保未设置 iostate
位(fail
、bad
或 eof
。在 C++11 中 eof
位将在调用 unget
.
然后查看运行后的stram状态。如果设置了 failbit,那么你忘记在调用 unget
之前清除流状态。如果设置了 badbit
,则存在内部错误。可能流不能再支持了。
你不能保证你甚至可以取消一个字符,不像 putback
,库应该支持放回至少一个字符。