2012-04-12 54 views
0

这是一个初学C++的作业问题,我知道vector,但不允许在这个assigment中使用。我搜索了四周,我发现如何制作一个尺寸不明的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

我想你不能使用std :: list然后。 – 2012-04-12 05:04:44

+0

与你的老师交谈。要么有最大数量的学生,要么你应该能够使用标准容器。如果你对这两者都是对的,找一个新的老师/学校。 – 2012-04-12 05:12:16

+0

@MooingDuck我在最后一个问题中得到了和这个一样的答案:O ... – George 2012-04-12 05:13:08

回答

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

这是一种常用的方法,其中递归被广泛使用,但在过程语言中不常见。 – 2012-04-12 05:28:45

+0

我明白了,谢谢! – George 2012-04-12 05:29:00

1

如果你有足够的野心,你可以做与vector大致相同的事情 - 分配一些空间,跟踪你使用的空间有多少,以及何时/如果满了,分配一个空间更大的块(大约是1 1/2或2倍大),将数据从前一块复制到新块,然后开始将新数据插入到新块中。必要时重复。

+0

递归答案会更简单我认为 – 2012-04-12 05:16:26

+0

@MooingDuck他被授予这个问题作为家庭作业,所以真正的问题是他的教授寻找什么样的答案:重新实现'std :: vector'或原始解决方案使用一种不同的方法。 (我喜欢递归解决方案的优雅,但如果它是针对真正的应用程序,我会担心堆栈溢出等问题。) – 2012-04-12 07:33:50

0

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

如果你正在定义文件的结构,你有两种选择。你可以是

a)使字段长度固定,然后只是获得文件大小是开始和做一个部门来获取项目的数量。

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

+0

输入文件将由教师提供,我只包含3- 4名学生。但我不知道她会用多少。这可能是很多,因为我们被要求按姓氏按年龄分类。 (使用我们自己的排序实现)... – George 2012-04-12 05:14:24