【问题标题】:Stringstream is allowing getline call in functionStringstream 允许在函数中调用 getline
【发布时间】:2017-09-29 15:43:57
【问题描述】:

我通过引用将我从 cin 组装的字符串流传递给类函数。当我在类函数中调用streamstream.str() 时,所有输入都在那里。然而,在下一行,当我调用getline(stringstream,output) 时,它失败了并且永远不会启动循环。我的字符串流有什么问题?

#include <iostream>
#include <sstream>

using namespace std;

class HRMLMap{
    public:
        HRMLMap(stringstream& iss){
            string line;
            cout << iss.str() << endl;
            while(getline(iss,line)){
                cout << "it never gets here." << "\n";
            }
        }

};




int main() {
    std::string line;
    stringstream ss("", ios_base::app | ios_base::out);
    for(int i = 0; i < 4; ++i){
        getline(cin,line);
        ss << line << endl;
    }
    HRMLMap myHRMLMap(ss);

    return 0;
}

【问题讨论】:

  • 你怎么知道它没有启动循环?您的“失败”指示是什么?
  • 请显示演示问题的代码。另见minimal reproducible example。好像你简化了太多,所以严格来说它没有显示你描述的行为
  • 将 ss 声明为 stringstream ss; 你还没有选择 in - 默认应该足够好
  • NathanOliver,该代码不起作用。我测试了它。我认为您将 iss.str() 的输出与 getline() 的输出混为一谈。它永远不会到达 while 循环内部。
  • @Ben 哎呀。我忘了你加了换行符。

标签: c++ cin stringstream


【解决方案1】:

这里的问题在于您打开stringstream 的模式。你用过

stringstream ss("", ios_base::app | ios_base::out);

这意味着您将附加到流中并且流处于输出模式。这意味着你只能写入它,这意味着你不能读取它。

要修复它,您可以指定它也在输入模式下运行

stringstream ss("", ios_base::app | ios_base::out | ios_base::in);

或者你可以使用

stringstream ss;

这会给你同样的行为。

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 2013-04-28
    • 2015-03-13
    • 1970-01-01
    • 2013-02-16
    • 2011-08-12
    • 1970-01-01
    • 2021-08-30
    • 2010-10-10
    相关资源
    最近更新 更多