2016-12-27 42 views
1

我正在使用類構建一個簡單的家族樹,其中每個人都有一個ID並且可以有一個或多個關係,並且每個關係也都有一個ID。我試圖導入此文件,以便能夠使用類的方法導入樹:從C/C++中使用不同變量類型的文本文件讀取數據

9 
Charless 
0 
F 
2 5 
Dianaaaa 
0 
M 
1 
William 
1 
M 
6 
Harry 
1 
M 
-1 
... 

對於某些情況下,文本文件顯示人在樹,名字,兒子數關係號碼X,性別和這個人與之有關係的人的ID。如果該人沒有任何關係,則顯示「-1」。當我通過類方法添加人員或關係時,我會自動增加ID。要導入文件,我正在做這樣的事情:

ifstream f2; 
f2.open("databasev2.txt"); 
string name; char gender; 
int personrelationshipid; int sonofrelationshipid; 
int numberOfPeople; 
vector<int>relationships; 
f2 >> numberOfPeople; 
if (f2.is_open()) 
{ 
while (f2 >> name >> sonofrelationshipid >> gender) 
{ 

    while (f2 >> personrelationshipid) 
    { 
     relationships.push_back(personrelationshipid); 
     f2.ignore(0, ' '); 
    } 
//...do something with the variables 

我目前的問題是循環停止後的第一次迭代。我不確定是否考慮到第二個名字「Dianaaa」不再是一個字符串......現在,它正在讀「9」,「Charless」,「0」,「F」,「2」和「 5「,並將它們插入到矢量中,然後停止。如果我只有一個關係,這不會發生(即如果我刪除了5)

此外,我想添加名稱之間有空格 - 要做到這一點,我想我只需要創建一個字符串並使用f2.getline(name,string),然後清除緩衝區並刪除換行符,這樣我就沒有麻煩閱讀下一行了,對嗎?

我無法使用boost/JSON來序列化信息 - 我必須手動執行此操作,因此我非常感謝「重新發明輪子」中的一些幫助。但是,我可以根據需要編輯該文件,並添加一些分隔符。

在此先感謝

+0

使用正確的工具來解決這些問題是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

我確實使用了調試器 - 這就是我發現它正確讀取第一行然後退出程序 –

+1

我想,第二個while循環是你的問題。 你能減少你的文件到2塊和1的關係嗎? 也試試f2 >> personrelationshipid;沒有while循環? – demonking

回答

2

你需要調用f2.clear()每一個循環退出的時候,因爲你使用流作爲布爾操作。因此,當循環退出時,會有錯誤標誌導致後續流操作失敗。

+0

謝謝,那就是問題所在 - 我現在只需要調整一些東西! –

2

你需要清除文件流的狀態,與std::basic_ios::clear()功能,外環內:

while (f2 >> name >> sonofrelationshipid >> gender) 
    { 

     while (f2 >> personrelationshipid) 
     { 
      relationships.push_back(personrelationshipid); 
     } 

     if (!f2.eof()) 
      f2.clear(); 
+0

謝謝,那就是問題所在 - 我現在只需要調整一些東西! –

相關問題