5

だから私は、名前と名前を二重リンクリストに追加しようと試みています。「string、string」という形式のさまざまな長さのさまざまなテキストファイルがあり、list>を使用してデータを保存しています。

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

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行のテキストを含むテキストファイルの場合、(忘れないでください)と表示されるため、混乱します。リストのサイズが48であるため、最後の行が欠落しているため、98でのみ読み取ります。

なぜ48?ペアを作成したので、それは何かをする必要がありますが、ペアは名前と名前を1つの値として取るだけなので、ペアで読み取っていないかのように意味がありません。実際には約2倍になります。

私に気が遠くなる。

もう一度、すべてのあなたの助けに感謝します!

4

2 に答える 2

5

あなたが説明したように、あなたのファイルは実際には値の間にスペースがないように感じます、それでそれはこのように見えます:

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

これでプログラムを実行する場合、のサイズはlist2(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

于 2013-01-28T22:43:45.057 に答える
-1

ifstreamの演算子>>は、改行をさらに別のトークンとして扱います。したがって、おそらく最初の行から通常どおりに最初と2番目の単語が読み取られますが、読み取られる3番目のトークンは最初の行の新しい行です。

getlineを使用して改行も「食べる」ようにしてください。

于 2013-01-28T22:17:03.140 に答える