这些帖子没有回答我的问题:
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 is not the szKeyword。我在任何地方都找不到一个关于如何使用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;发布于 2012-08-24 23:28:17
在调用str("")之后,您没有对流执行clear()。再看一看this answer,它也解释了为什么你应该使用str(std::string())重置。在您的示例中,您还可以仅使用str(szLine)重置内容。
如果不调用clear(),流的标志(如eof)将不会被重置,从而导致令人惊讶的行为;)
发布于 2012-08-24 23:47:00
这取决于你要用它做什么。通常,只创建一个新的istringstream或ostringstream会更容易。要“重置”一个流,您必须清除它的缓冲区,清除任何错误标志,重置任何格式标志,加上精度和填充,使用原始语言环境重新imbue它,并且不要忘记使用从xalloc返回的值生成的任何扩展格式信息。总而言之,正确是不可能的。
在此期间,您的循环是错误的,可能会导致最后一行被处理两次。file.eof()只有在输入失败后才有可用的含义(即使到那时,它也不是100%可靠的)。你想要的是:
std::string line;
while ( std::getline( file, line ) ) {
if ( !line.empty() ) {
std::istringstream buffer( line );
// ...
}
}(实际上,您可能希望在测试empty之前修剪该行的尾随空格。)
发布于 2015-12-31 07:09:46
ss是stringstream。使用
第一步: ss.clear();
要重用字符串流--完全清除字符串流。
https://stackoverflow.com/questions/12112259
复制相似问题