質問
文字列と数値の両方を含むファイルを解析しています。それぞれのフィールドをフィールドごとに処理したいと思います。各フィールドは、スペースまたはライン終了文字によって区切られています。 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関数はこれを認識していません。
所属していません StackOverflow