2016-12-27 7 views
1

私はクラスを使って単純な家系図を構築しています。各人はIDを持ち、1つ以上の関係を持つことができ、各関係にも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 "にしてベクトルに挿入して停止します。 1つの関係しかない場合、これは起こりません(つまり、5を削除した場合)

また、名前をスペースで区切って追加したいと思います。文字列を作成するだけですf2.getline(name、string)を使用して、バッファをクリアして改行文字を削除して、次の行を読むのに問題はありません。

情報をシリアライズするためにboost/JSONを使用することはできません。私は手動で行う必要があります。そのため、「ホイールを改革する」の助けに感謝します。しかし、私はいくつかの区切り文字を追加して、私が望むようにファイルを編集することができます。あなたはブールオペランドとしてストリームを使用しているため、あなたは、ループが終了するたびにf2.clear()呼び出す必要があり、事前

+0

適切なツールは、このような問題を解決するために、あなたのデバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

私はデバッガを使用しました - それは最初の行を正しく読み取ってからプログラムを終了したことがわかりました –

+1

私は、2番目のwhileループが問題だと思います。 ファイルを2ブロック1関係に減らすことはできますか? また、f2 >> personrelationshipidを試してください。 whileループなしで? – demonking

答えて

2

感謝。したがって、ループが終了すると、後続のストリーム操作が失敗するエラーフラグが発生します。

+0

ありがとう、それは問題でした - 私はちょうど今いくつかのものを微調整する必要があります! –

2

あなたが外側のループの内側に、std::basic_ios::clear()機能で、ファイルストリームの状態をクリアする必要があります。

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

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

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

ありがとう、それは問題でした - 私はちょうど今いくつかのものを微調整する必要があります! –

関連する問題