微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std :: getline没有按照我的预期去做

如何解决std :: getline没有按照我的预期去做

我正在使用RHEL5.4,QT4.8 在getline中仅处理文件的第一行。 我在stringstream ss上的qDebug打印文件中的所有行。 我在记录结构上的qDebug重复文件第一行中的数据以获得总数 文件中的行数。 我在结果向量上执行的qDebug再次重复文件第一行中的数据以获得总数 文件中的行数。

首先,我在头文件中声明一个记录结构。

    struct data_rec
    {
        std::string name;
        std::string value;
    };
    std::ifstream myfile("foo.bar");
    if(!myfile.is_open()){
       qDebug() << "Could not open file";
   }else {
       qDebug() << "File opened";
       std::string line;

       std::stringstream ss;
       std::stringstream tss;

       while(std::getline(myfile,line))
       {
           data_rec records;
           tss.str("");
           ss<<line<<std::endl;
           tss<<line<<std::endl;   //; temp stringstream

           std::getline(tss,records.name,',');
           std::getline(tss,records.value,');

           qDebug()<<"!!!" << records.name.c_str();
           qDebug()<<"!!!" << records.value.c_str();

           result.push_back(records);

           tss.str(std::string());
       }

       for(int x = 0; x < 46; x++)
       {
          QString tstr1 = QString::fromStdString(result[i].name);
          QString tstr2 = QString::fromStdString(result[i].value);
           qDebug() << tstr1 << " -> " << tstr2;
       }

       qDebug() << QString::fromStdString(ss.str());

       qDebug() <<  "\n////////////////////////////////////////\n";
       myfile.close();


   }

解决方法

您将在每次循环迭代中重用tss,但不会在每次迭代中清除其错误状态,而仅清除其字符串内容。第一次迭代完成后,如果该行未以','字符终止,则流可能已到达EOF且现在处于错误状态。用空白字符串调用tss.str()不会清除错误状态,您需要为此调用tss.clear(),否则下一次对getline(tss)的调用将失败。

while (std::getline(myfile,line))
{
    data_rec records;
    // tss.str(""); // <-- redundant here!

    ss << line << std::endl;
    tss << line << std::endl;

    std::getline(tss,records.name,',');
    std::getline(tss,records.value,');

    qDebug() << "!!!" << records.name.c_str();
    qDebug() << "!!!" << records.value.c_str();

    result.push_back(records);

    tss.str(std::string());
    tss.clear(); // <-- add this!
}

否则,根本不重用stringstream,在每次迭代中创建一个新的

while (std::getline(myfile,line))
{
    data_rec records;

    std::istringstream tss(line); // <-- here!
    ss << line << std::endl;

    std::getline(tss,');

    qDebug() << "!!!" << records.name.c_str();
    qDebug() << "!!!" << records.value.c_str();

    result.push_back(records);
}

也就是说,在while循环结束后,您随后的for循环假定result包含46个元素,但是while循环中没有任何内容可以保证那。 for循环应改为查看result.size()

for(size_t x = 0; x < result.size(); x++)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。