这是一个初学的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]
指向它。我觉得我有点做两次工作只是为了拥有合适的尺寸。是否有一些我缺少的技巧或事情?
谢谢。
答案 0 :(得分: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);
这个想法只是在你更深入地进行递归时阅读这些行。当你到达文件的末尾时,你知道要分配多少学生,然后你可以解析这些行并在递归时以相反的顺序填充数组。您还将获得通过输出参数返回的学生数。
答案 1 :(得分:1)
如果你有足够的野心,你可以做与vector
大致相同的事情 - 分配一些空间,跟踪你正在使用多少空间,以及何时/如果它已满,分配一个更大的块(大小为1 1/2或2倍),将前一个块中的数据复制到新块,然后开始将新数据插入新块。根据需要重复。
答案 2 :(得分:0)
输入文件是您定义的内容还是为练习定义的内容?
如果要定义文件的结构,则有两种选择。你可以
a)将字段固定为长度,然后将文件大小作为开头并进行除法以获取项目数。
或
b)第一行存储文件中的项目数。