【问题标题】:File Reading Function only Reads First line then quits文件读取功能仅读取第一行然后退出
【发布时间】:2017-02-15 13:21:56
【问题描述】:

问题描述

基本上,在我的“Roster.h”头文件中,我有一个来自学生类的“学生”对象数组(其中包括函数 changeScore、SetID、setTotal、setLetterGrade)。在下面将附加的函数中,它只是读取第一行数据,然后在 while 条件下退出。我已经盯着这个问题几个小时了,可以用第二(或第三)双眼睛。任何批评也值得赞赏,因为我知道我不是最有效的程序员。应该注意“m_studentnum”是在构造函数中初始化为 0 的私有数据。提前致谢!

代码

void Roster::readStudentRecord(string file)
{
    ifstream in;
    string studentID;
    string line;
    int ola, cla, quiz, homework, exam, bonus, total, final = 0;

    in.open(file.c_str());

    getline(in, line);
    while (in >> studentID) {
        in >> cla >> ola >> quiz >> homework >> exam >> bonus >> total >> final;
        m_students[m_studentNum].Student::setID(studentID);
        m_students[m_studentNum].Student::changeScore(Student::CLA, cla);
        m_students[m_studentNum].Student::changeScore(Student::OLA, ola);
        m_students[m_studentNum].Student::changeScore(Student::QUIZ, quiz);
        m_students[m_studentNum].Student::changeScore(Student::HOMEWORK, homework);
        m_students[m_studentNum].Student::changeScore(Student::EXAM, exam);
        m_students[m_studentNum].Student::changeScore(Student::BONUS, bonus);
        total = cla + ola + quiz + homework + exam + bonus;
        m_students[m_studentNum].Student::setTotal(total);
        if (total >= 90) {
            m_students[m_studentNum].Student::setLetterGrade('A');
        }
        else if (total >= 80 && total < 90) {
            m_students[m_studentNum].Student::setLetterGrade('B');
        }
        else if (total >= 70 && total < 80) {
            m_students[m_studentNum].Student::setLetterGrade('C');
        }
        else if (total >= 60 && total < 70) {
            m_students[m_studentNum].Student::setLetterGrade('D');
        }
        else {
            m_students[m_studentNum].Student::setLetterGrade('F');
        }
        m_studentNum++;
    }
}

数据文件 - 请注意,我正在做一个 getline 来读取数据列的标题

 ID         CLA   OLA   Quiz   Homework   Exam   Bonus   Total   FinalGrade   
 c088801    10    15      4         15     56       5 
 c088802     9    12      2         11     46       2 
 c088803     8    10      3         12     50       1
 c088804     5     5      3         10     53       3
 c088805     3    11      1         10     45       0 
 c088806     8    14      2         11     40      -1  
 c088807     4    12      2         12     48      -2
 c088808    10    10      3         11     36       0
 c088809     8     8      3         11     39       0
 c088810     6     9      4          9     47       3
 c088811     8     7      3         13     41       3
 c088812     4    11      3         11     37       1

【问题讨论】:

  • 您能否显示您正在尝试阅读的该文件的前几行?
  • 当然!对不起!我的意思是包括那个哈哈
  • 你现在应该可以看到编辑了@Someprogrammerdude
  • 似乎您尝试从每行读取 8 个数字,但只有 6 个。这会使 in 进入失败状态,并停止进一步阅读。
  • 好地方!我想这就是为什么我需要第二双眼睛。不幸的是,我现在收到错误消息:OLA1.exe 中 0x508F4B19 (vcruntime140d.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0xCCCCCCCC。

标签: c++ visual-studio fstream


【解决方案1】:

“Total”和“FinalGrade”列是空的,您可以无条件地尝试阅读它们。

当您尝试这样做时,输入将包含下一行的“ID”,因为它不是整数,导致为流设置 failbit 标志,从而导致循环条件为false 和循环结束。

一种可能的解决方案是将 while 行读入字符串,将该字符串放入 std::istringstream 对象,然后像现在一样读取非空列。然后尝试从输入字符串流中读取可能为空的列。

如果这些列假定为空,另一种解决方案是根本不读取它们。

【讨论】:

  • 是的,我不敢相信我没有注意到我正在阅读这些内容!但我现在不幸得到错误:OLA1.exe 中 0x508F4B19 (vcruntime140d.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0xCCCCCCCC。
  • 没关系,看来我的问题是我忘记让对象数组中声明的对象数量变化以反映文件中的数量!现在一切都解决了!
  • @gavsta707 这就是为什么你不应该使用固定大小的数组,而应该使用std::vector。当您向它们添加元素时,它们会动态增长。 :)
  • 不幸的是,我目前只能使用数组。数组大小是可变的,我只是忘记删除一些错误测试,实际上将对象限制为 9 个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多