【问题标题】:Reading and then working on stream data读取然后处理流数据
【发布时间】:2013-04-17 11:01:45
【问题描述】:

我正在处理来自 Accelerated C++ 的问题 4-6。问题要求我重写Student_info结构、read()函数和grade()函数,以便立即计算最终成绩,然后将其作为唯一成绩存储在Student_info中。

以前,该程序的工作方式如下:

  1. read() 从输入流中读取数据并将数据存储到 Student_info 对象中
  2. 每个对象都添加到一个向量中
  3. 读取和添加每个对象后,将对向量中的每个 Student_info 对象调用 grade()

有了新的约束,我觉得我必须结合read()grade() 函数,所以不需要存储中间等级。问题是从流中读取时,我不知道我是否遇到了文件末尾,直到我这样做。执行此操作时,我尝试在文件数据末尾调用 grade() 函数。

考虑到约束是读取然后立即处理数据,我没有看到解决方法。怎么处理?

struct Student_info 
{
    std::string name;
    double final_grade;
};

istream& read(istream& is, Student_info& s)
{
    double midterm, final;
    is >> s.name >> midterm >> final;

    // Error, when EOF is read, grade() will process bad data
    s.final_grade = grade(midterm, final);
    return is;
}

void main()
{
    vector<Student_info> students;
    Student_info record;
    while (read(cin, record))
        students.push_back(record);
}

【问题讨论】:

  • 请显示当前代码;它会比你的解释更容易理解。

标签: c++ stream


【解决方案1】:

您可以在read 函数中检查记录是否被成功读取。比如这样:

istream& read(istream& is, Student_info& s)
{
    string name;
    double midterm, final;

    if( is >> name >> midterm >> final ) {
        s.name = name;
        s.final_grade = grade(midterm, final);
    }

    return is;
}

请注意,您可以像在原始代码中一样直接读入s.name,但我的实现具有事务语义:它要么读取整个结构,要么不理会它,以防它无法读取所有结构字段。

【讨论】:

  • 是的,它没有关于流的事务语义,但我不确定如何以干净的方式做到这一点。
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多