質問

文字列と数値の両方を含むファイルを解析しています。それぞれのフィールドをフィールドごとに処理したいと思います。各フィールドは、スペースまたはライン終了文字によって区切られています。 ifstream :: getline()操作は、単一の区切り文字のみを許可します。したがって、私が現在行っているのは、デリミッターとしてのキャラクター「キャラクター」との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...
 }

ただし、「SEEKG」は、ストリームを1文字が遅すぎるように見えるようです(したがって、各ラインが破損する前に各フィールドの最初のキャラクターを見逃しています)。ラインごとにスキャンすることにより、そのようなパーサーをコーディングする他の方法があることを知っていますが、私は本当に理由を理解したいと思います この特定 コードの一部が失敗します...

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

役に立ちましたか?

解決

Loadmasterが言ったように、キャラクターのための計算がない場合があります。または、これはただオフ1エラーである可能性があります。

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

 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...
 }

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

他のヒント

入力ストリームには、見た目/プッシュバック文字がある場合があります。 IIRC、SEEK/TELL関数はこれを認識していません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top