2013-01-28 11 views
5

だから、私は二重リンクリストに姓と名を追加しようとしています。 "string、string"という形式のさまざまな長さのさまざまなテキストファイルがあり、リストを使用してデータを格納しています。リストとペアに関する混乱

私はこのコードを使用しています:

typedef std::list< std::pair<string,string> > listPair; 

...

list<pair<string, string> > mylist; 
ifstream myFile; 
myFile.open("20.txt"); 

pair<string, string> stuff; 
while (myFile >> stuff.first >> stuff.second) 
{ 
    mylist.push_back(stuff); 
} 

listPair::iterator iter = mylist.begin(); 

for(;iter != mylist.end();iter++) 
{ 
    string s = (*iter).first; 
    cout << s << endl; 
    string c = (*iter).second; 
    cout << c << endl; 
} 

は今私がいる問題は、まず、リストの最後の項目が追加されていないことです。 のように、すべてのファイルが終了行を逃してしまっているので、少し混乱します。

また、すべての名前が追加されていることを確認するためにmylist.size()を実行しています。99の名前、つまり99行のテキストを含むテキストファイルについては、 (最後の行がないために98で読み込まれることを忘れないでください)、リストのサイズは48です。

WHY 48? 私はペアを成し遂げたので何かすることはできますか?それでもペアで読むのではないように実際には二重であるかのように理にかなっていません。ペアは単にファーストネームとファーストネームを1つの値として取るためです。

私に怒鳴りつく心。

もう一度お世話になりました。

+0

あなたは 'getline'を探しているのでしょうか? –

+2

ちょうど助言として、汎用コンテナとして 'list'ではなく' vector'を使うべきです。あなたがそれを使用している方法から、私はここに 'list'の必要性を見ません。 –

+0

入力ファイル '20.txt'(または少なくとも抽出ファイル)を追加できますか?あなたの入力が適切にフォーマットされていない可能性があります。 – Zeta

答えて

5

私持っているあなたが説明してきたように、それは次のようになりますので、実際には、値の間にスペースを持っていないあなたのファイルを感じて:あなたは、この上でプログラムを実行した場合

one,two 
three,four 
five,six 
seven,eight 
nine,ten 

、サイズlistの番号は2(floor(number_of_lines/2)、これは48となります)、最後の行はlistに入れられません。どうして?

最初に、std::ifstream::operator>>(std::string&)を呼び出すたびに、空白になるまでを抽出します。この場合、最初の行の最初の空白は、末尾に\nです。したがって、最初の反復では、stuff.first"one,two"になり、次の行はstuff.secondに読み込まれ、"three,four"になります。これはlistにプッシュされます。次の2行は同じ方法で読み込まれ、{"five,six","seven,eight"}のペアが与えられます。次の反復では、最初のoperator>>"nine,ten"を抽出し、2番目は失敗し、whileの条件が終了し、最後の行が破棄されます。

空白があっても、firstにはpairのカンマで終わることになりますが、それは確かにあなたが望むものではありません。

このような問題にアプローチするよりよい方法は、行を抽出し、適切なように、その行を解析するためにstd::getlineを使用することです:あなたが使用する正当な理由がない限り

std::string line; 
std::pair<std::string, std::string> line_pair; 
while (std::getline(myFile, line)) { 
    std::stringstream line_stream(line); 
    std::getline(line_stream, line_pair.first, ','); 
    std::getline(line_stream, line_pair.second); 
    mylist.push_back(line_pair); 
} 

私もstd::vectorを使用することをお勧めしますstd::list

+0

ありがとう、これはちょうど私の問題であり、それは完全に働いた! goshは毎日何か新しいことを学ぶhaha –

-1

演算子> > ifstreamでは、改行をさらに別のトークンとして扱います。したがって、おそらく、最初の行から普通のようにあなたの第1と第2の単語を読むでしょうが、第3行のトークンは第1行の新しい行です。

getlineを使って改行を '食べる'こともお試しください。

+3

抽出プログラムは、新しい行を他の空白と同様に扱います。あなたが一貫して 'operator >>'を使うならば、それらを回避する必要はありません。 –

関連する問題