2012-04-12 37 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