我写了以下测试代码:
int main(int argc, char* argv[]) {
stringstream ss;
int num;
ss << "54321";
ss >> num;
ss.str("");
ss << "12345";
ss >> num;
fprintf(stderr, "%d\n", num);
}
令我惊讶的是,结果是 54321。如何使用提取运算符 (>>) 正确覆盖变量?
我写了以下测试代码:
int main(int argc, char* argv[]) {
stringstream ss;
int num;
ss << "54321";
ss >> num;
ss.str("");
ss << "12345";
ss >> num;
fprintf(stderr, "%d\n", num);
}
令我惊讶的是,结果是 54321。如何使用提取运算符 (>>) 正确覆盖变量?
第一次提取后,您到达了流的末尾,因此eofbit
设置和第二次提取失败。
int main(int argc, char* argv[]) {
stringstream ss;
int num;
ss << "54321";
ss >> num;
// eofbit was set above,
// we need to clear it
ss.clear();
ss.str("");
ss << "12345";
ss >> num;
fprintf(stderr, "%d\n", num);
}
clear()
在尝试第二次提取之前调用成员函数。第二个问题是内部 get 指针的位置,它不会自动重置。用来seekg()
设置。
编辑:被击中的东西不是必需的,在这里解释。
当流到达流的末尾时,std::ios_base::eofbit
被设置。在尝试提取任何日期之前,提取会检查是否设置了任何状态标志,如果是,则它不执行任何操作并且您的提取失败:
std::stringstream ss;
ss << "54321";
ss >> num; // sets eof:
std::cout << "eof: " << ss.eof() << "\n";
一旦设置了任何状态标志,要让流执行任何操作,您需要首先清除标志:
ss.clear();
ss << "12345";
if (ss >> num) {
std::cout << "num=" << num << "\n";
}
else {
std::cout << "failed to extract a value\n";
}
就个人而言,我一般不使用输出运算符来设置字符串流的内容。相反,我通常使用该str()
成员:
std::ostringstream out; // note: this is just an output string stream
...
out.clear(); // the clear is still needed
out.str("12345");