0

这是一个初学者的C ++作业问题,我知道vector,但不允许在这个作业中使用它。我四处寻找,我也发现了如何制作一个array[]未知大小的。但这有点棘手(有点)。我读到的例子都是这样的:获取一个输入,然后基于该输入(大小 n)创建数组。

我已经创建了这个学生类,但现在我需要一个array来存储它们。我事先不知道会有多少学生。我只有一个文本文件的输入,每个学生都在一行上。格式如下,样例大概5个,但不知道老师会用多少个来测试我的程序。

输入文件如下:

George Chan Computer_Science New York 23
Johnny Chan Computer_Science New Jersery 22
....

但问题是我不知道有多少学生,直到我读完整个文本图块(或者我不知道是否有其他方法可以做到这一点)。我目前的方法是逐行阅读,增加一个计数器studentCounter,直到我完成,然后我创建我的Student* myRoster = Student[studentCounter]. 但是当我不得不再次开始阅读文件。并逐行解析信息并创建一个Student对象并让一个myRoster[x]指向它。我觉得我做了两次工作只是为了有合适的尺寸。是否有一些技巧或我缺少的东西?

谢谢你。

4

3 回答 3

4

这是使用递归的一种简单方法:

Student* readStudents(istream& infile,int& n_students)
{
  string line = readLine(infile);
  if (!infile) {
    return new Student[n_students];
  }
  int index = n_students++;
  Student* students = readStudents(infile,n_students);
  students[index] = parseLine(line);
  return students;
}

然后你这样称呼它:

int n_students = 0;
Student* students = readStudents(infile,n_students);

这个想法只是在您深入递归时阅读这些行。当您到达文件末尾时,您知道要分配多少学生,然后您可以解析行并在退出递归时以相反的顺序填充数组。您还将获得通过输出参数返回的学生人数。

于 2012-04-12T05:14:21.530 回答
1

如果你有足够的野心,你可以做大致相同的事情vector——分配一些空间,跟踪你正在使用多少空间,以及何时/如果它满了,分配一个更大的块(比如1 1/2 或 2 倍大),将数据从前一个块复制到新块,并开始将新数据插入新块。根据需要重复。

于 2012-04-12T05:04:38.960 回答
0

输入文件是您定义的还是为练习定义的?

如果您要定义文件的结构,您有两个选择。你也可以

a)使字段固定长度,然后以文件大小为起点,然后进行除法以获取项目数。

或者

b) 第一行存储文件中的项目数。

于 2012-04-12T05:10:57.530 回答