gpt4 book ai didi

c++ - stringstream::ignore(INT_MAX, '\n') 导致流失败

转载 作者:行者123 更新时间:2023-11-28 07:56:46 25 4
gpt4 key购买 nike

当我调用 stringstream 时,stringstream::ignore() 似乎总是失败,即使这是在调用 stringstream::clear() 之后完成的:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cassert>

using namespace std;

int main() {
int a, b;
stringstream ss;
string str;
ifstream inFile("file.txt");
if(!inFile) {
cerr << "Fatal: Cannot open input file." << endl;
exit(1);
}

while(getline(inFile, str)) {
ss << str; // read string into ss
ss >> a >> b; // stream fails trying to store string into int

ss.clear(); // reset stream state
assert(ss.good()); // assertion succeeds

ss.ignore(INT_MAX, '\n'); // ignore content to next newline
assert(ss.good()); // assertion fails, why?
}

return 0;
}

file.txt 包含以下文本:

123 abc
456 def

为什么 ss.good() 之后 ss.ignore() 为假?

最佳答案

std::endl输出 \n并冲洗流。然而,stringstream::flush()是没有意义的,什么都不做。 flush仅当底层缓冲区绑定(bind)到终端等输出设备时才有意义,但是,stringstream无处刷新内容。如果您想清除字符串流的内容,请执行 ss.str("");反而。但是,我可能会将代码更改为以下内容:

while(getline(inFile, str)) {
ss.str(str); // call ss.str() to assign a new string to the stringstream
if(!ss >> a >> b) // check if stream fails trying to store string into int
{
ss.clear(); // Read failed, so reset stream state
}
else
{
// Read successful
}
// Do other stuff
}

此外,如果你想在字符串流中插入一个换行符,只需执行 ss << '\n';不要调用std::endl .

关于c++ - stringstream::ignore(INT_MAX, '\n') 导致流失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12541049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com