Home > Software design >  Read text file and store student info into a a vector
Read text file and store student info into a a vector

Time:12-03

the text file looks something like this:

9528961 Adney Smith CS 4.2
9420104 Annalynn Jones EE 2.6
9650459 Bernadette Williams IT 3.6
...

there are 45 lines in the text file meaning 45 students. I have read the text file and when I run the program I get this:

9428167
Mason
Taylor
CS
4.8
9231599
Alexander
Jones
CS
2.3

My main file looks like this:

int main()
{
    auto student = new Student<string>();
    std::vector<string> students;
    std::ifstream inputFile;
    inputFile.open("enroll_assg.txt");
    std::string line;
    if(inputFile.is_open()){
        while(std::getline(inputFile, line)){
                std::istringstream iss(line);
                std::string word;
                while(iss >> word){
                    std::cout << word << std::endl;
                    for(int i = 0; i < 5; i  ){
                        

                    }
                }
        }
    } 
    return 0;
}

Each student has 5 columns (id, fname, lname, department, gpa) and I need make a vector which includes all these student object. I need some help doing this so comments and answers are most welcome. Thank you.

CodePudding user response:

Try something more like this instead:

int main()
{
    std::ifstream inputFile("enroll_assg.txt");
    if (inputFile.is_open()){
        std::vector<Student> students;
        std::string line;
        while (std::getline(inputFile, line)){
            std::istringstream iss(line);
            Student student;
            iss >> student.id;
            iss >> student.fname;
            iss >> student.lname;
            iss >> student.department;
            iss >> student.gpa;
            students.push_back(student);
        }
        // use students as needed...
    }
    return 0;
}

Then, you should consider having Student overload the operator>>, which will greatly simplify the loop so you can do something more like this instead:

std::ostream& operator>>(std::ostream &in, Student &student)
{
    std::string line;
    if (std::getline(in, line))
    {
        std::istringstream iss(line);
        iss >> student.id;
        iss >> student.fname;
        iss >> student.lname;
        iss >> student.department;
        iss >> student.gpa;
    }
    return in;
}

int main()
{
    std::ifstream inputFile("enroll_assg.txt");
    if (inputFile.is_open()){
        std::vector<Student> students;
        Student student;
        while (inputFile >> student){
            students.push_back(student);
        }
        // use students as needed...
    }
    return 0;
}

CodePudding user response:

IMHO, the best method is to use a struct or class to model or represent the data record you need to read.

struct Student
{
    unsigned int id;
    std::string  first_name;
    std::string  last_name;
    std::string  major_code;
    double       gpa;
    friend std::istream& operator>>(std::istream& input, Student& s);
};

std::istream& operator>>(std::istream& input, Student& s)
{
    input >> s.id;
    input >> s.first_name;
    input >> s.last_name;
    input >> s.major_code;
    input >> s.gpa;
    input.ignore(10000, '\n'); // Synchronize to next line.
    return input;
}

Your input code could look like this:

std::vector<Student> database;
Student s;
//... open file.
while (student_file >> s)
{
    database.push_back(s);
}

The above code will read each student record into a database, so you can analyze it.

  •  Tags:  
  • c
  • Related