1

文字列と数値の両方を含むファイルを解析しています。ファイルをフィールドごとに処理し、それぞれをスペースまたは行末文字で区切って処理したいと考えています。ifstream::getline() 操作では、区切り文字を 1 つだけ使用できます。したがって、私が現在行っているのは、文字「 」を区切り文字として使用した getline であり、「\ n」が検出された場合は、ストリーム内の前の位置に手動で戻ります。

 ifstream ifs ( filename , ifstream::in );
 streampos pos;
 while (ifs.good())
 {  
  char curField[255];  

  pos = ifs.tellg();
  ifs.getline(curField, 255, ' '); 
  string s(curField);
  if (s.find("\n")!=string::npos) 
  {   
   ifs.seekg(pos); 
   ifs.getline(curField, 255, '\n'); 
   s = string(curField);
  }

 // process the field contained in the string s...
 }

ただし、「シーク」はストリームを1文字遅すぎるように配置しているようです(したがって、各フィールドの最初の文字を各改行の前に見逃しています)。行ごとにスキャンするなど、このようなパーサーをコーディングする他の方法があることは知っていますが、この特定のコードが失敗する理由を本当に知りたいです...

どうもありがとうございました!

4

2 に答える 2

0

入力ストリームに先読み/プッシュバック文字が含まれる場合があります。IIRC、seek/tell 関数はこれを認識していません。

于 2010-10-06T01:18:15.947 に答える
0

ロードマスターが言ったように、説明されていない文字があるか、これは単にオフバイワン エラーである可能性があります。

しかし、これは言わなければなりません...これを置き換えることができます:

 ifstream ifs ( filename , ifstream::in );
 streampos pos;
 while (ifs.good())
 {  
  char curField[255];  

  pos = ifs.tellg();
  ifs.getline(curField, 255, ' '); 
  string s(curField);
  if (s.find("\n")!=string::npos) 
  {   
   ifs.seekg(pos); 
   ifs.getline(curField, 255, '\n'); 
   s = string(curField);
  }

 // process the field contained in the string s...
 }

これとともに:

 ifstream ifs ( filename , ifstream::in );
 streampos pos;
 string s;
 while (ifs.good())
 {  
   ifs >> s;
   // process the field contained in the string s...
 }

あなたが望む行動を得るために。

于 2010-10-06T01:28:57.997 に答える