为什么我不能在我的结构中打印名称?

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

我正在读取一个包含名称 ID 和成绩的数据文件,我将信息存储在结构中并使用指针数组来存储结构地址。完成后,我将它动态分配给一个数组,然后我想打印所有结构中的名称,但没有打印任何内容,也没有错误消息。如何打印新动态数组中每个结构的名称?

下面是我的代码

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;

试试像这样的东西:

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

不过,您根本不需要固定数组:

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

可以使用 std::vector 代替 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