2017-07-28 95 views
-1

我有一个应该通过字符串流读取输入文件的程序。该文件包含学生姓名,以及我想要测试的平均分数。该文件可以包含任意数量的大于1且小于10的学生的任何数量的测试分数。如何做一个for循环在C++中的字符串流读取的值?

如果我通过字符串流读取文件中的所有值,如何将每个测试分数值存储为整数,我可以将它们相加?这里是我到目前为止的代码,我不知道甚至是正确的:

string fname, lname, line; 
getline(cin, line); 
istringstream sin; 
sin.str(line); 
sin >> fname >> lname; 

这是通过值解析的正确方法吗?在顶部,我宣布了一个struct'student',像这样:

struct student { 
    string first_name; 
    string last_name; 
    double avg_score; 
} student1; 

谢谢!

+3

为什么不使用'cin >> fname >> lname;'?它做同样的事情。 – NathanOliver

+1

如果你显示了更多的代码,并且你可以指向你不知道该怎么做的行,那么帮助你会更容易。请阅读[mcve] – user463035818

+0

@NathanOliver:我想这是因为一行可以包含任意数量的分数;所以我也会分别阅读每一行,因为它更清楚地表明每一行都被视为一个单独的“记录”。 –

回答

0

如果每行的分数数量不同,我倾向于用整行读取并逐一解析它们。因此,您可以依靠>>运营商返回false,一旦没有更多的分数可以在一行中读取。所以我认为你是正确的。请看下面的代码演示如何处理的>>返回值:

int main() { 

    ifstream f(DATAFILE); 
    if(f) { 
     string line; 
     while (getline(f,line)) { 
      string fname,lname; 
      istringstream ss(line); 
      if (ss >> fname >> lname) { 
       double sum = 0; 
       double value; 
       int count = 0; 
       while (ss >> value) { 
        sum += value; 
        count++; 
       } 
       cout << line << " gives average: " << sum/count << endl; 
      } 
     } 
    } 
} 

struct存储的值是直线前进(留给了你:-))。如果您遇到麻烦,请询问。 希望它有帮助。

0

如果你需要存储多个数据,你通常需要一个所谓的容器类。容器类可以存储任意数量的相同类型的数据并提供管理容器元素的方法。

C语言中的标准容器类++是std::vector,因此,举例来说,你的情况,你可以定义通过

#include <vector> 

std::vector<student> allStudents; 

容器要添加的student1的数据,你可以做

allStudents.push_back(student1) 

对于其他任何东西,你最好阅读初学者的C++教科书,因为使用容器类是C++程序员的基本技能。

相关问题