为什么我不能在我的结构中打印这个名字?

问题描述 投票:-2回答:1

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

这是我的代码如下

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;
c++ pointers struct dynamic-arrays
1个回答
2
投票

尝试更像这样的东西:

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

© www.soinside.com 2019 - 2024. All rights reserved.