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

Posted

技术标签:

【中文标题】为啥我不能在我的结构中打印名称?【英文标题】: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。 【参考方案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。你试过吗? 不,我的错,我正在查看代码的中断部分并误解了。

以上是关于为啥我不能在我的结构中打印名称?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在我的类中内联函数? [复制]

为啥在我的结构中调用 self.init 之前使用了错误“self”?

为啥我不能从我的查询中选择?

为啥我不能在同一个结构中存储一个值和对该值的引用?

为啥我不能在我的 pygame 文本框中输入超过 1 个字母? [复制]

访问程序中的符号表以打印结构的字段名称