【问题标题】:How do I store data in members of multiple classes from an ifstream in a separate class?如何将数据存储在单独类中的 ifstream 中的多个类的成员中?
【发布时间】:2014-06-29 07:21:24
【问题描述】:

我目前正在学习 C++,尽管我在理解如何使用输入和输出文件流实现程序的面向对象风格时遇到了麻烦。我已经使用操作重载方法作为朋友类制作了一个程序,尽管这显然是一种不好的做法,因为它违反了类的隐私。

在某些情况下,我需要编写一个程序来读取包含学生姓名、ID、成绩日期等的 csv 文件。这个文件的读取将进入我假设的注册课程。注册将有一个成员 ifstream infile;以及在构造函数中指定的文件的名称。然后这个类将有一个功能,这是我卡住的地方。我正在尝试读取文本文件并将文件的元素分配给对象实例的变量。例如,学生 1 有 3 门课程/单元,每个单元都有一个成绩。因此,我将为该学生存储 3 个结果(在结果类中),然后增加到文本学生并阅读他们的课程和成绩。注意:每个学生和课程信息都在文件的一行中。

基本上我的问题是我应该如何尝试将文件流中的信息存储到另一个类的对象中,例如:结果类或课程类?如果我需要将数据存储在 Unit 类甚至 Date 类是 Results 类的聚合对象的位置怎么办?最初使用集合和获取是合乎逻辑的,但它是否正确。我不是要求代码,而是更多面向 OO 和文件流的最佳实践。

【问题讨论】:

  • 一旦被存储的对象的类型偏离了单一的基础,我希望很明显,一种或另一种形式的类型识别最好是序列化的一部分。

标签: c++ file oop stream ifstream


【解决方案1】:

最佳实践也很繁琐——实现std::istream& operator>>(std::istream&, Student&),负责为学生解析数据。这到底是什么样子很难说……大概学生的名字可以是多个单词,可能带有嵌入的' 甚至-。如果已知id 至少包含一位数字,那么您可以使用它来区分id 和name。您可以使用>> 将空格分隔的标记读取到std::string,但需要小心,因为这会跳过换行符以查找下一个字符串,因此如果您正在阅读最后一行的内容并想停在您可能需要将'\n' 分隔符指定为getline 的换行符(如果您想容忍意外填充,请删除任何其他尾随空格)。如果处理换行太难,您可能需要考虑使用while (getline(input_stream, line)) 将整行读入std::string line 的外部循环,然后创建std::istringstream iss(line); 并从iss 解析单个学生的数据...这样您可以解析直到失败或“EOF”,而无需担心换行符。

这种方法应该分层应用。如果您想解析日期,请为您的 Date 类创建一个 operator>>。

遗憾的是,采用这种最佳实践可能会让学习者望而生畏....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多