流不按预期工作

时间:2014-04-08 09:57:13

标签: c++ string stream stringstream

我有这个问题,需要真正快速解决。这是我的代码:

    void stypendium() {
        string tresc = "";
        string temp;
        stringstream ss;
        fstream file;
        vector<float> grades;
        float grade, sum, av;
        file.open(this->plik, ios_base::in);
        if(!file.is_open()) {
            ofstream fileTmp(this->plik);
            fileTmp.close();
            file.open(this->plik, ios_base::in);
        }
        while (file >> temp) {
            if(strspn( temp.c_str(), "-.0123456789" ) == temp.size()) {
                ss.str("");
                ss << temp;
                ss >> grade;
                grades.push_back(grade);
            }
        };
        sum = 0;
        for(int i=0;i<grades.size();++i) {
            sum += grades[i];
        }
        av = sum / grades.size();
        cout << sum << "/" << grades.size() << "=" << av;
        file.close();
    }

};

问题在于行

  

ss&lt;&lt;温度;

没有任何东西进入流,虽然临时有价值;

2 个答案:

答案 0 :(得分:1)

使用ss.clear()成员函数为第一个和连续的成绩值正确准备字符串流。以下是参考:std::basic_ios::clear。请记住clear()可以抛出异常。

根据最新的源代码编辑,while循环体与以前几乎相同。

 while (file >> temp) {
     if(strspn( temp.c_str(), "-.0123456789" ) == temp.size()) {
         ss.str("");
         //
         // Call the clear() member function here
         //
         ss.clear(); 
         ss << temp;
         ss >> grade;
         grades.push_back(grade);
     }
 };

一个简单的测试文件,逐行提供等级值,每行获得一次,并且最后一个输入文件等级值只被添加到等级向量中一次。

答案 1 :(得分:0)

您还需要在执行ss.clear();后致电ss.str("");

原因是当stringstream正在提取一个float时,如果它在它已经完全读完一个float之前到达了字符串的末尾,那么它将在流上设置eof状态。然后,由于设置了eof,因此将来的转换失败。您必须clear()重置eof州。