如何对c ++中字符串流读取的值进行for循环?

时间:2017-07-28 18:53:22

标签: c++ arrays file struct stringstream

我有一个应该通过字符串流读取输入文件的程序。该文件包含学生姓名和我想要平均的考试成绩。该文件可以包含任意数量的大于1且小于10的学生的任意数量的考试成绩。

如果我按字符串流读取文件中的所有值,我如何将每个测试分数值存储为可以求和的整数?这是我到目前为止的代码,我不确定是否正确:

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

这是解析值的正确方法吗?在顶部,我宣布了一个像这样的结构“学生”:

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

谢谢!

2 个答案:

答案 0 :(得分: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中是直截了当的(并留给您:-))。万一你遇到麻烦请问。 希望它有所帮助。

答案 1 :(得分:0)

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

C ++中的标准容器类是std::vector,因此,例如,在您的情况下,您可以通过

定义容器
#include <vector>

std::vector<student> allStudents;

添加student1的数据

allStudents.push_back(student1)

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