【问题标题】:How come I can't print the name in my structure?为什么我不能在我的结构中打印名称?
【发布时间】:2019-03-14 22:51:20
【问题描述】:

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

【问题讨论】:

  • Student *students[100]; 是一个包含 100 个指针的数组。这些指针指向哪里?您没有为实际的 Student 对象分配任何内存
  • while(inFile.eof()) 是错误的。并且Student* students[100]; 应该是Student students[100];Student 对象而不是Student* 指针),但是如果将其更改为std::vector&lt;Student&gt; students;,那么您可以完全摆脱dynamicStudentscounter,因为vector 是已经是一个动态数组了。
  • 为了有用的参考,像Student *students[100];这样的声明是从右到左读取的:数组,有100个元素,命名为student,由Student类型的指针组成。
  • @Tzalumen 实际上,他们最好阅读in a spiral instead

标签: c++ pointers struct dynamic-arrays


【解决方案1】:

试试这样的:

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

【讨论】:

  • 但我不知道文件中有多少学生,只是不会超过 100,但可能会更少
  • @Unknownzdx "我不知道文件中有多少学生" - 正是出于这个原因,您应该使用vector,它会随着需要。如果你知道这个数字永远不会超过 100,你可以在填充之前 reserve() vector 以减少内存重新分配。但无论哪种方式,getline() 将在到达文件末尾时停止读取,假设每个学生在文件中自己的行。
  • 但是对于这个我不能使用向量,所以对于第一个例子,你会怎么做才能让学生也少于 100 人?
  • @Unknownzdx 我给出的第一个例子已经做到了。就像我说的,getline() 循环会在到达文件末尾时自动停止,使counter 小于 100。你试过吗?
  • 不,我的错,我正在查看代码的中断部分并误解了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多