Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件读取函数只读取第一行,然后退出_C++_Visual Studio_Fstream - Fatal编程技术网

C++ 文件读取函数只读取第一行,然后退出

C++ 文件读取函数只读取第一行,然后退出,c++,visual-studio,fstream,C++,Visual Studio,Fstream,问题描述 基本上,在我的“花名册.h”头文件中,我有一个来自Student类的“Student”对象数组(包括函数changeScore、SetID、setTotal、setLetterGrade)。在下面将附加的函数中,它只读取第一行数据,然后在while条件下退出。我已经盯着这个问题看了好几个小时了,可以用第二双(或第三双)眼睛。任何批评都值得赞赏,因为我知道我不是最有效的程序员。应该注意的是,“m_studentnum”是构造函数中初始化为0的私有数据。提前谢谢 代码 void Roste

问题描述

基本上,在我的“花名册.h”头文件中,我有一个来自Student类的“Student”对象数组(包括函数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++;
    }
}
“Total”和“FinalGrade”列为空,您无条件尝试读取它们

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

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


另一个解决方案是,如果这些列应该是空的,就干脆不读取它们。

您可以显示您试图读取的文件的前几行吗?当然可以!很抱歉我想说的是HahayYou现在应该看到编辑@SomeProgrammerDude似乎你试图从每行中读取8个数字,但只有6个。这将使处于状态的
进入失败状态,并停止进一步读取。很好!我想这就是为什么我需要第二双眼睛。不幸的是,我现在得到了错误:OLA1.exe中0x508F4B19(vcruntime140d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0xCCCC。是的,我不敢相信我没有注意到我正在读这些!但我现在不幸地得到了错误:OLA1.exe中0x508F4B19(vcruntime140d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0xCCCC。不管怎样,我的问题似乎是我忘记了使对象数组中声明的对象数量变化以反映文件中的数量!一切都搞定了@gavsta707这就是为什么不应该使用固定大小的数组,而是使用
std::vector
。当您向它们添加元素时,它们会动态增长。:)不幸的是,我现在只能使用数组。数组大小是可变的,我只是忘了删除一些bug测试,实际上是将对象限制为9。
 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