为啥我不能在我的结构中打印名称?
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<Student> students;
,那么您可以完全摆脱dynamicStudents
和counter
,因为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”?