C++ 输入文件中的数组和结构出现问题

C++ 输入文件中的数组和结构出现问题,c++,C++,我正在为一门大学课程研究这个问题,我不确定为什么它不起作用。我认为我已经正确地设置了所有内容,但是当我尝试运行该程序时,在第一次尝试输入文件名时文件将无法打开,当我再次输入文件名时,我在“xmemory”部分得到了一个“Exception Switch”错误,我不知道这是什么意思 程序从中获取数据的输入文件只是包含以下数据的文本文件: 201742 Sponge Bob 82.6 201701 Patrick Star 14.1 201753 Squidward Tentacles 85.43

我正在为一门大学课程研究这个问题,我不确定为什么它不起作用。我认为我已经正确地设置了所有内容,但是当我尝试运行该程序时,在第一次尝试输入文件名时文件将无法打开,当我再次输入文件名时,我在“xmemory”部分得到了一个“Exception Switch”错误,我不知道这是什么意思

程序从中获取数据的输入文件只是包含以下数据的文本文件:

201742 Sponge Bob 82.6
201701 Patrick Star 14.1
201753 Squidward Tentacles 85.43
201744 Sandy Squirrel 75.61
201700 Plankton Plank 100.0
课程的最终输出应显示最高和最低年级,以及学生的名字和姓氏、平均分数和受测学生人数。任何帮助都将不胜感激

// Zane Richards
// Lab 10 Q2
// 4/6/2020

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
#include <fstream>

using namespace std;

struct student {
    int ID;
    string firstName;
    string lastName;
    float grade;
};

void maxGradeFunc(struct student* s, int size)
{
    float maxGrade = 0;
    string firstName, lastName; 

    for (int i = 0; i < size; ++i) 
    {
        if (s[i].grade > maxGrade)
        {
            maxGrade = s[i].grade;
            firstName = s[i].firstName; 
            lastName = s[i].lastName; 
        }
    }

    cout << "Maximum grade is " << maxGrade << endl;
    cout << "The name of the student with the grade is: " << firstName << " " << lastName << endl;
} 

void minGradeFunc(struct student* s, int size)
{
    float minGrade = 999;
    string firstName, lastName;

    for (int i = 0; i < size; ++i) 
    {
        if (s[i].grade < minGrade) 
        {
            minGrade = s[i].grade;
            firstName = s[i].firstName;
            lastName = s[i].lastName;
        }
    }

    cout << "Maximum grade is " << minGrade << endl;
    cout << "The name of the student with the grade is: " << firstName << " " << lastName << endl;
}


void avgGradeFunc(struct student* s, int size)
{
    float sum = 0; 
    for (int i = 0; i < size; ++i) 
    {
        sum += s[i].grade;
    }

    float avg = sum / size; 
    cout << "Avearge grade is " << avg << endl;
    cout << "The total number of students are: " << sum << " students" << endl;
}
int main()
{
    ifstream inFile;
    string fileName = "";
    struct student s[5]; 
    int ID; 
    string firstName, lastName; 
    float grade;
    int i = 0;

    cout << "Please enter the input file name: "; //File is named "Student.txt"
    cin >> fileName; 

    while (!inFile.is_open()) {
        cout << "Sorry, the file did not open. \nTry again, or type \"cancel\" to quit: ";
        cin >> fileName;
        if (fileName == "cancel") {
            cout << "Cancelling..." << endl;
            break;
        }
        else {
            inFile.open(fileName);
        }
    }

    while (inFile.is_open()) {

        inFile >> ID; 

        s[i].ID = ID;
        inFile >> firstName;
        s[i].firstName = firstName;


        inFile >> lastName;
        s[i].lastName = lastName;


        inFile >> grade;
        s[i].grade = grade;
        i++;
    }

    maxGradeFunc(s, 5); 
    minGradeFunc(s, 5);
    avgGradeFunc(s, 5);
    return 0;

}
//赞恩·理查兹
//实验室10 Q2
// 4/6/2020
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构学生{
int-ID;
字符串名;
字符串lastName;
浮子等级;
};
void maxGradeFunc(结构学生*s,整数大小)
{
float maxGrade=0;
字符串firstName,lastName;
对于(int i=0;i最大坡度)
{
maxGrade=s[i]。等级;
firstName=s[i].firstName;
lastName=s[i]。lastName;
}
}

cout解决了问题,删除了允许多次尝试的代码,并将其更改为仅打开文件并修复。感谢所有人的帮助,非常感谢!

解决了问题,删除了允许多次尝试的代码,并将其更改为仅打开文件并修复。感谢帮助ryone,非常感谢!

在用户输入文件名后,为什么要立即检查infle是否已打开?您实际上从未第一次尝试打开该文件。此外,您没有写“我在xmemory部分遇到异常抛出错误,但我不知道这意味着什么”,请复制并粘贴错误。你不需要描述错误,只需发布错误的具体内容。更糟糕的是,你不想描述错误。如果你还不知道错误的含义,你怎么能确定你没有漏掉那些允许有错误的人现在,在几秒钟内回答是什么意思?将!file.isopen()的循环更改为!file,因为您想检查它是否存在。您也可以检查该文件是否当前正在使用,但此逻辑使其无法运行…在此修复之后,我就遇到了输出问题。您的输入策略使用“>>”一个字符一个字符地循环,而不是完整的字符串没有第一次尝试打开文件。这就是为什么您总是看到错误消息。然后,您的第二个循环是一个infinte循环,因为文件是打开的,并且永远不会更改,所以循环将永远继续(直到您的程序崩溃)。从用户输入文件名后,为什么要立即检查infle是否已打开?您实际上从未第一次尝试打开该文件。此外,您没有写“我在xmemory部分遇到异常抛出错误,但我不知道这意味着什么”,请复制并粘贴错误。你不需要描述错误,只需发布错误的具体内容。更糟糕的是,你不想描述错误。如果你还不知道错误的含义,你怎么能确定你没有漏掉那些允许有错误的人现在,在几秒钟内回答是什么意思?将!file.isopen()的循环更改为!file,因为您想检查它是否存在。您也可以检查该文件是否当前正在使用,但此逻辑使其无法运行…在此修复之后,我就遇到了输出问题。您的输入策略使用“>>”一个字符一个字符地循环,而不是完整的字符串没有第一次尝试打开该文件。这就是为什么您总是看到错误消息。然后,您的第二个循环是infinte循环,因为该文件是打开的,并且永远不会更改,所以循环将永远继续(直到您的程序崩溃)。