首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重用stringstream

如何重用stringstream
EN

Stack Overflow用户
提问于 2012-08-24 23:21:56
回答 6查看 36.5K关注 0票数 20

这些帖子没有回答我的问题:

resetting a stringstream

How do you clear a stringstream variable?

代码语言:javascript
复制
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的明确示例。

答案后的新代码:

代码语言:javascript
复制
...
szBuffer.str(szLine);
szBuffer.clear();
szBuffer>>szKeyWord;
...

好了,这是我的最终版本:

代码语言:javascript
复制
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;
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-24 23:28:17

在调用str("")之后,您没有对流执行clear()。再看一看this answer,它也解释了为什么你应该使用str(std::string())重置。在您的示例中,您还可以仅使用str(szLine)重置内容。

如果不调用clear(),流的标志(如eof)将不会被重置,从而导致令人惊讶的行为;)

票数 32
EN

Stack Overflow用户

发布于 2012-08-24 23:47:00

这取决于你要用它做什么。通常,只创建一个新的istringstreamostringstream会更容易。要“重置”一个流,您必须清除它的缓冲区,清除任何错误标志,重置任何格式标志,加上精度和填充,使用原始语言环境重新imbue它,并且不要忘记使用从xalloc返回的值生成的任何扩展格式信息。总而言之,正确是不可能的。

在此期间,您的循环是错误的,可能会导致最后一行被处理两次。file.eof()只有在输入失败后才有可用的含义(即使到那时,它也不是100%可靠的)。你想要的是:

代码语言:javascript
复制
std::string line;
while ( std::getline( file, line ) ) {
    if ( !line.empty() ) {
        std::istringstream buffer( line );
        //  ...
    }
}

(实际上,您可能希望在测试empty之前修剪该行的尾随空格。)

票数 10
EN

Stack Overflow用户

发布于 2015-12-31 07:09:46

ss是stringstream。使用

第一步: ss.clear();

  • second :
  • (“”);

要重用字符串流--完全清除字符串流。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12112259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档