0

I am new to programming and I am having trouble reading data from a file and entering it into a struct array, while keeping track of each data being entered:

The file would contain:

Name, ID Number, and GPA

    Courtney Love 1234569 3.5
    Bob Joe 1234570 3.0
    Dave Henry 1234571 2.9

struct Student
{
    string name;
    int id;
    float GPA;
    void printStudent();
};

Declare an array of Student type that can hold up to 5 members:

    Student a_members[5];

Open the file, read in each line and store the data in the array, keep track of each student read in:

    fstream file_;
    file_.open ("students.txt");
    if(file_.is_open())
    {
       while(file_.good())
        {
        }
    }
    else
    {
    cout << "File is not open"<< endl;
    }
    return 0;

I am stuck on the "while" conditional statement. After that I don't know what I should do to input the data from the file line by line and place into the "struct array". As of right now, I feel like I have tried everything! I deleted everything and figured it was best to start over. It was becoming too complicated! Maybe I am just not understanding the concept. If anyone can point me in the right direction, please do so! Thank you!

ProgrammerMia
  • 15
  • 1
  • 2
  • Easy solution: search stackoverflow for "C++ read file array", or "C++ read file structure". – Thomas Matthews Sep 04 '15 at 23:12
  • 1
    Have you looked at the Related questions listed on the right ? [Reading from a file into an array of structs](http://stackoverflow.com/questions/20274217/reading-from-a-file-into-an-array-of-structs?rq=1), [Read data from file and store into an array of structs](http://stackoverflow.com/questions/29814933/read-data-from-file-and-store-into-an-array-of-structs?rq=1) ... ? – Leiaz Sep 04 '15 at 23:14

2 Answers2

1

You should not use good(), just like you should not use eof().
(Neither is used in any decent beginner-level material, yet every beginner manages to find them. And then they wonder why it didn't work.)

You should instead rely on the fact that a stream itself is "true-ish" if it's in a good state, and just keep reading until it isn't.

Idiomatic C++ would look like this:

std::ifstream file("students.txt");
Student s;
while (file >> s.name >> s.id >> s.GPA)
{
    // Process the student
}

or, a fancy version:

std::istream& operator>> (std::istream& is, Student& s)
{
    return is >> s.name >> s.id >> s.GPA;
}

std::ifstream file("students.txt");
Student s;
while (file >> s)
{
    // Process the student
}

(In your code, you'll need to also keep track of how many Students you've read.)

molbdnilo
  • 55,783
  • 3
  • 31
  • 71
1

Here is one from possible solutions:

#include <iostream>
#include <vector>
#include <fstream>

struct Student
{
    Student() : first_name(), surname(){}
    char first_name[64];
    char surname[64];
    int id;
    float GPA;
    void printStudent()
    {
        std::cout << "Name: " << first_name << " " << surname << " ID: " << id << " GPA: " << this->GPA << std::endl;
    }
};

std::vector<Student>student;

bool LoadFile(const char* filename)
{
    if (filename == NULL)return false;
    std::fstream stream(filename, std::ios::in);
    if (!stream.is_open())return false;
    else
    {
        char buffer[255]; // for solution 1!
        while (!stream.eof())
        {
            memset(buffer, 0, sizeof(buffer));
            Student _student;

            #pragma region SOLUTION_1
            //stream.getline(buffer, sizeof(buffer));
            //sscanf(buffer, "%s %s %d %f", _student.first_name, _student.surname, &_student.id, &_student.GPA);
            #pragma endregion

            #pragma region SOLUTION_2
            stream >> _student.first_name >> _student.surname >> _student.id >>_student.GPA;
            #pragma endregion

            student.push_back(_student);
            student[student.size() - 1].printStudent();
        }
    }
    return true;
}

int main()
{
    LoadFile("students.txt");
    getchar();
    return 0;
}
Cruppy
  • 54
  • 4
  • Please read [this question](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) and its answers. – molbdnilo Sep 05 '15 at 05:30