【问题标题】:While Loop looping only once when using getline from file使用文件中的getline时,while循环仅循环一次
【发布时间】:2019-07-27 12:36:59
【问题描述】:

我有这么一小段代码:

fileopen.open(file_name);
while (getline(fileopen, line, ',')){
    string temp;
    vector<string> mug;
    temp = line;
    stringstream ss(temp);
    while (getline(ss, temp, ' ')){
        mug.push_back(temp);
    }
    stringstream conv;
    double vol, cos;
    conv << mug.at(1);
    conv >> vol;
    stringstream().swap(conv);
    conv << mug.at(3);
    conv >> cos;
    mugs.push_back(make_tuple(mug.at(0), vol, mug.at(2), cos));
    stringstream().swap(conv);
    stringstream().swap(ss);
    temp.clear();
}
sort(mugs.begin(), mugs.end(), sort_by);
for (int i = 0; i < mugs.size(); i++){
    cout << "Country: " << get<0>(mugs[i]) << " ";
    cout << ", Volume: " << get<1>(mugs[i]) << " ";
    cout << ", Material: " << get<2>(mugs[i]) << " ";
    cout << ", Price: " << get<3>(mugs[i]) << "\n";
}

我有多个清除和stringstream().swap(),因为这是一个众所周知的问题。 &lt;sstream&gt; 似乎中断了 while 循环的迭代。但是,即使这似乎也不起作用。从文件中给出的输入如下:

RUS 0.1 Wood 20
USA 0.4 Glass 0.5

当前代码根据需要打印第一行,但无法迭代并打印第二行。有什么建议吗?

我已经尝试使用continuegoto 来解决这个问题。这些解决方案都没有奏效。

【问题讨论】:

  • 附带说明:考虑使用std::strtod()std::stod()string 值解析为doubles,而不是使用stringstream。而且你不需要swap()stringstream 来清除它的数据,你可以使用它的str() 方法来分配一个空白字符串。而且您当然不需要 swap()/clear() 之后将超出范围的容器变量。
  • @RemyLebeau 正式指出!我之前在考虑使用 'std::stod()' 但是遇到了一些问题,所以我决定使用 stringstream 来制定一个临时解决方案

标签: c++ while-loop getline


【解决方案1】:

所发布的输入文件在任何行中都没有,。因此,使用

while (getline(fileopen, line, ',')){

没有意义。使用

while (getline(fileopen, line)){

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2018-09-11
    • 2016-08-21
    • 2018-04-17
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多