1

私は最初にインデックスのようなメカニズムを構築し、getlineを使用してテキストファイルの各行を読み取り、既知のヘッダー宣言(string.compare)と一致するかどうかを確認し、そのポイントへのインデックスとしてtellg位置を保存します。次に、seekg(index、ios :: beg)を使用して、ファイル内のヘッダーがある場所を検索します。インデックスを作成してseekg(0、ios :: beg)を呼び出すときにファイルを一度読み取った後、次のgetlineは、ファイルの最初の行が表示されると予想される空の文字列を返します。

私の問題をよりよく強調するために、私のコードの一部を以下に示します

//build the index
while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead);
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

// start reading the file data
m_fileIn.seekg(0,ios::beg);
//read first line (title)

getLineID関数は、文字列比較の結果に応じてintを返します。

ファイルを再度読み取る必要がある場合、getlineの使用は正しくありませんか?

4

2 に答える 2

2

ストリーム内に不良ビットが設定されているため、問題が発生します。
不良ビットがリセットされるまで、ストリームの操作は無視されます。

// After the loop reset the Bad Bits.
m_fileIn.clear()

注:不良ビットは、EOFを含む多くのエラー状態の1つです。

しかし、それはあなたの大きな問題ではありません。

Classic anti pattern ファイルの読み取りにを使用しています。
むしろこれを使用してください。

while (getline (m_fileIn,lineRead))
{
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

問題は、EOFを読み終えるまでEOFが設定されないことです。
最後の有効な読み取りはUPTOを読み取りますが、EOFを超えません(したがって、EOFは設定されません)。

したがって、ファイルの最後の行を読んだ状況を考えてみてください。過去に読んだことがないため、EOFは設定されていません。したがって、ループに入ります。ここで、getline()を実行します。読み取るデータがまったくない(1バイトではない)ため、これは過去のEOFを読み取ろうとします。したがって、getline()は失敗し、値が不確定なlineReadを使用してgetlineID()を呼び出しています(標準では、EOF条件が満たされたときにlineReadがどうなるかは示されていませんが、おそらく最後の行の値が読み取られているようです。ループ内でリセットします)。

このコードのもう1つの問題は、EOFのみをチェックすることです。別の種類のエラーが発生するとどうなりますか?ループは実際には無限ループでスタックします。これは、エラーフラグが設定されている場合、それ以上読み取りが行われないため、EOFに到達できないためです。

while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead)
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

解決策は、whileループテストで読み取り操作を実行することです。getline()が最初のパラメーターとして渡されたストリームを返すため、これは機能します。したがって、ストリームはブールコンテキストで使用されます。ストリームがブールコンテキストで使用される場合、ブールとして使用できる型に変換されます。このオブジェクトの値は、エラーがない場合はtrue、それ以外の場合はfalseと同等です。

この状況では、読み取りが試行されますが、失敗した場合、ループに入ることがありません。

于 2010-08-31T12:14:22.317 に答える
1

ここに投稿し、さまざまなWebサイトをトロールした後、行を追加しました

m_fileIn.clear();

行の前

getline (m_fileIn,lineRead);

エラーフラグをクリアすることで(私はeofエラーを想定しています)、通常どおり続行できました。

マーティン-私が無意識のうちに使用したアンチパターンについてもっと知りたいと思っています。コードを更新して、変更を加えました。ありがとうございます。

于 2010-08-31T12:31:32.827 に答える