-1

ペアになった文字列のリストがあり、各リストの一番上の要素を削除して比較します。ただし、リストのサイズが大幅に増加するトップ要素を削除すると。pop_front() を試したり、イテレータを作成したりしました。方法を知っている限り、同じ問題が発生します。

std::ifstream myReadFile;
std::list<std::pair<std::string,std::string>> startTape;
std::pair<std::string,std::string> pair;

while (std::getline(myReadFile, pair.first , ','))
{
    std::getline(myReadFile, pair.second);
    startTape.push_back(pair);
}
myReadFile.close();

startTape { size=8 }

std::pair<std::string,std::string> firstCompare = startTape.front();
startTape.remove(*startTape.begin());
std::pair<std::string,std::string> secondCompare = startTape.front();
startTape.remove(*startTape.begin());

startTape { size=1753706592 }

startTape リストを調べると、ループしているようです。

(readFile の内容は以下の通り) N,C /n I,G /n A,U /n H,A /n G,M /n C,I /n S,H /n U,N /n

4

2 に答える 2

1

上記のすべてを含む完全なプログラムを作成しました ファイルの読み込み方法を少し変更しました-最初のパラメーターがストリーム名である getline() を呼び出す方法に慣れていないので、作成しました個々の要素を読み込むための文字バッファーで、それらをペアにコピーします。また、2 つの要素が読み取られない場合に備えて、ファイルの最後でおかしなことをしないようにします (ファイルの最後に \n があるかどうかに関係なく機能します)。

#include <fstream>
#include <iostream>
#include <list>

#define BUF 100
using namespace std;

int main() {
  std::ifstream myReadFile;
  std::list<std::pair<std::string,std::string> > startTape;
  std::pair<std::string,std::string> pair;
  char sbuf[BUF]; // temp storage for file read

  myReadFile.open("listOwords.txt");
  if(!myReadFile) {
    cerr << "Error: file could not be opened" << endl;
    exit(1);
  }
  cout << "file opened successfully" << endl;

  while(myReadFile.getline(sbuf, BUF, ',')) {
    pair.first = sbuf;
    myReadFile.getline(sbuf, BUF);
    pair.second = sbuf;
    if(myReadFile.good()) {
      // only process if both elements were read successfully
      // this deals with the problem of a "half pair" being read if the file is terminated with \n
      startTape.push_back(pair);
      cout << "read a pair: " << pair.first << ", " << pair.second << endl;
      }
  }  
  myReadFile.close();

  cout << "Size of startTape is now " << startTape.size() << endl;

  std::pair<std::string,std::string> firstCompare = startTape.front();
  startTape.remove(*startTape.begin());
  cout << "Size of startTape is now " << startTape.size() << endl;

  std::pair<std::string,std::string> secondCompare = startTape.front();
  startTape.remove(*startTape.begin());
  cout << "Size of startTape is now " << startTape.size() << endl;

  exit(0);
}

listOwords の内容:

>cat listOwords.txt 
N, C
I, G
A, U
H, A
G, M
C, I
S, H
U, N

これから得られる出力は次のとおりです。

file opened successfully
read a pair: N,  C
read a pair: I,  G
read a pair: A,  U
read a pair: H,  A
read a pair: G,  M
read a pair: C,  I
read a pair: S,  H
read a pair: U,  N
Size of startTape is now 8
Size of startTape is now 7
Size of startTape is now 6

この正確なコードで同じ結果が得られない場合はお知らせください。

于 2013-01-26T16:41:11.600 に答える
0

私はあなたがリストの方向を間違って考えていると思います。リストの「top」は「back」(push_back、pop_back)または「end」(rbegin)です。

front()の代わりにback()を使用し、pop_front()を使用して最初の要素を削除してみてください。

それでも、そのように変化するリストのサイズは、どこかのバグのように聞こえます。

于 2013-01-26T13:39:54.123 に答える