Search code examples
c++pointersstructdynamic-arrays

How come I can't print the name in my structure?


I am reading in a file of data with names IDs and grades and I am storing the info in a struc and using a pointer array to store struc addresss. After I am done I am dynamically allocating it to an array and then I want to print the names in all the structs yet nothing prints and there is no error message. How do I print the names in each of the structs in the new dynamic array?

Here is my code below

ifstream inFile;
Student *students[100];

string netID, studentName;
double grade1, grade2, grade3;

inFile.open("Asg3Grades.txt"); //opens the file

int counter = 0;

while(inFile.eof()){
    inFile >> netID >> studentName >> grade1 >> grade2 >> grade3;

    double average = (grade1+grade2+grade3)/3;

    students[counter]->ID=netID;
    students[counter]->name=studentName;
    students[counter]->grade=average;

    counter++;
}

inFile.close(); //closes the file

Student *dynamicStudents = nullptr;
dynamicStudents = new Student[counter];

for (int i=0; i<counter; i++) {
    dynamicStudents[i] = *(students[i]);
}

for (int i=0; i<counter; i++) {
    cout << dynamicStudents[i].name << endl;
}

return 0;

Solution

  • Try something more like this:

    ifstream inFile;
    
    Student students[100];
    int counter = 0;
    
    string line, netID, studentName;
    double grade1, grade2, grade3;
    
    inFile.open("Asg3Grades.txt"); //opens the file
    
    while (getline(inFile, line)) {
    
        istringstream iss(line);
    
        if (iss >> netID >> studentName >> grade1 >> grade2 >> grade3) {
    
            double average = (grade1 + grade2 + grade3) / 3;
    
            students[counter].ID = netID;
            students[counter].name = studentName;
            students[counter].grade = average;
    
            if (++counter == 100) break;
        }
    }
    
    inFile.close(); //closes the file
    
    Student *dynamicStudents = new Student[counter];
    
    for (int i = 0; i < counter; i++) {
        dynamicStudents[i] = students[i];
    }
    
    for (int i = 0; i < counter; i++) {
        cout << dynamicStudents[i].name << endl;
    }
    
    delete[] dynamicStudents;
    

    Live Demo

    Though, you don't really need the fixed array at all:

    ifstream inFile;
    
    Student* students = nullptr;
    int counter = 0, capacity = 0;
    
    string line, netID, studentName;
    double grade1, grade2, grade3;
    
    inFile.open("Asg3Grades.txt"); //opens the file
    
    while (getline(inFile, line)) {
    
        istringstream iss(line);
    
        if (iss >> netID >> studentName >> grade1 >> grade2 >> grade3) {
    
            double average = (grade1+grade2+grade3)/3;
    
            if (counter == capacity)
            {
                Student *temp = new Student[capacity + 100];
                for (int i = 0; i < counter; ++i)
                    temp[i] = students[i];
                delete[] students;
                students = temp;
                capacity += 100;
            }
    
            students[counter].ID = netID;
            students[counter].name = studentName;
            students[counter].grade = average;
    
            ++counter;
        }
    }
    
    inFile.close(); //closes the file
    
    for (int i = 0; i < counter; ++i) {
        cout << students[i].name << endl;
    }
    
    delete[] students;
    

    Live Demo

    Which can be simplified further by using std::vector instead of new[]:

    ifstream inFile;
    vector<Student> students;
    
    string line, netID, studentName;
    double grade1, grade2, grade3;
    
    inFile.open("Asg3Grades.txt"); //opens the file
    
    while (getline(inFile, line)) {
    
        istringstream iss(line);
    
        if (iss >> netID >> studentName >> grade1 >> grade2 >> grade3) {
    
            double average = (grade1+grade2+grade3)/3;
    
            Student student;
            student.ID = netID;
            student.name = studentName;
            student.grade = average;
    
            students.push_back(student);
        }
    }
    
    inFile.close(); //closes the file
    
    for (size_t i = 0; i < student.size(); ++i) {
        cout << students[i].name << endl;
    }
    

    Live Demo