首页 > 解决方案 > 为什么我不能在我的结构中打印名称?

问题描述

我正在读取具有名称 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++pointersstructdynamic-arrays

解决方案


尝试更多类似的东西:

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;

现场演示

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

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;

现场演示

可以通过使用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;
}

现场演示


推荐阅读