C++ 数据流不能按预期工作

C++ 数据流不能按预期工作,c++,string,stream,stringstream,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::

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

    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();
    }

};
void stypendium(){
字符串tresc=“”;
字符串温度;
细流ss;
流文件;
病媒等级;
浮动等级、总和、平均值;
打开(this->plik,ios_base::in);
如果(!file.is_open()){
流文件tmp(this->plik);
fileTmp.close();
打开(this->plik,ios_base::in);
}
while(文件>>temp){
如果(strspn(temp.c_str(),“-.0123456789”)==temp.size()){
ss.str(“”);
ss>grade;
坡度。向后推(坡度);
}
};
总和=0;

对于(inti=0;i您还需要在执行
ss.str(“”;
之后调用
ss.clear();

原因是,当stringstream提取浮点值时,如果它在明确读取浮点值之前到达字符串的末尾,那么它将在流上设置
eof
状态。然后,由于设置了
eof
,未来的转换将失败。您必须
清除()
重置
eof
状态。

使用
ss.clear()
成员函数为第一个和连续的等级值正确准备stringstream。以下是参考:。请记住
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);
     }
 };
while(文件>>temp){
如果(strspn(temp.c_str(),“-.0123456789”)==temp.size()){
ss.str(“”);
//
//在这里调用clear()成员函数
//
ss.clear();
ss>grade;
坡度。向后推(坡度);
}
};

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

EOF的常见错误测试-测试成功输入,而不是查看:这不是问题所在,但多亏了你,我找到了解决方案。不管怎样,有什么问题吗关于我的主要问题的建议?当然我理解,主要问题是
ss没有
ss.str()
ss由于输入文件的布局未知,我为我们其余的人添加了
ss.str(“”
)。