这些主题不回答我:
How do you clear a stringstream variable?
std::ifstream file( szFIleName_p );
if( !file ) return false;
// create a string stream for parsing
std::stringstream szBuffer;
std::string szLine; // current line
std::string szKeyWord; // first word on the line identifying what data it contains
while( !file.eof()){
// read line by line
std::getline(file, szLine);
// ignore empty lines
if(szLine == "") continue;
szBuffer.str("");
szBuffer.str(szLine);
szBuffer>>szKeyWord;
szKeyword
将始终包含第一个单词,szBuffer
未被重置,无法在任何地方找到有关如何使用stringstream的明确示例。
回答后的新代码:
...
szBuffer.str(szLine);
szBuffer.clear();
szBuffer>>szKeyWord;
...
好的,那是我的最终版本:
std::string szLine; // current line
std::string szKeyWord; // first word on the line identifying what data it contains
// read line by line
while( std::getline(file, szLine) ){
// ignore empty lines
if(szLine == "") continue;
// create a string stream for parsing
std::istringstream szBuffer(szLine);
szBuffer>>szKeyWord;
答案 0 :(得分:27)
调用clear()
后,您没有str("")
该流。再看一下this answer,它还解释了为什么要使用str(std::string())
进行重置。在您的情况下,您还可以仅使用str(szLine)
重置内容。
如果你不调用clear()
,流的标志(如eof
)将不会被重置,从而导致令人惊讶的行为;)
答案 1 :(得分:8)
这取决于你正在做什么。这通常更容易
创建新的istringstream
或ostringstream
。要“重置”流,
你必须清除它的缓冲区,清除任何错误标志,重置任何
格式化标志,加上精度和填充,重新imbue
它与
原始区域设置,不要忘记任何扩展格式信息
使用从xalloc
返回的值生成。总之,不可能
得到正确的。
虽然我在这,但你的循环是错误的,并且可能会导致
最后一行被处理两次。 file.eof()
只有一个有用的含义
输入失败后(即便如此,它不是100%可靠)。
你想要的是:
std::string line;
while ( std::getline( file, line ) ) {
if ( !line.empty() ) {
std::istringstream buffer( line );
// ...
}
}
(实际上,您可能希望修剪该行的尾随空格 在测试之前为空。)
答案 2 :(得分:1)
在大多数情况下,创建新的istringstream
或ostringstream
会更容易,而不是重置相同的内容。
但是,如果你想反感他们:
使用clear ()
重新发送流的标记(以避免意外行为)。
虽然您可以使用stringstream
更正str ("")
的内容,但为了提高效率,我们可能更喜欢str(std::string())
。
答案 3 :(得分:0)
ss是stringstream。使用
重用stringstream - 完全清除字符串流。
答案 4 :(得分:0)
如果你有一个班级成员的流,
使用unique_ptr<stringstream>
,
然后只需reset(new stringstream(...))
重复使用它。
答案 5 :(得分:0)
想象一个配置文件。
par1=11
par2=22
代码:
std::string line, strpar1, strpar2;
int par1, par2;
std::ifstream configfile("config.cfg");
std::getline(configfile, line); // first line to variable "line"
std::istringstream sline(line);
while (std::getline(sline, strpar1, '='));
par1 = std::stoi(strpar1); // par1 get 11
bool b = sline.eof(); // true
std::getline(configfile, line); // second line to variable "line"
sline.clear(); //
sline.str(line); // reuse "sline"
b = sline.good(); // true // goodbit is zero, indicating that none of the other bits is set.
b = sine.fail(); // false
b = sline.bad(); // false
b = sline.eof(); // false
while (std::getline(sline, strpar2, '='));
par2 = std::stoi(strpar2); // par2 get 22
goodbit is zero, indicating that none of the other bits is set