質問

私は当初、それは既知のヘッダ宣言(string.compare)と一致するかどうかをチェックし、その点へのインデックスとしてtellg位置を保存、のgetlineを使用してテキストファイルの各行を読み取り、インデックスのようなメカニズムを構築しています。 私の意図は、ヘッダがあるファイル内の場所に求めることを利用seekg(インデックス、IOS :: BEG)に続いています。 私のインデックスを構築するときに一度ファイルを読んとseekg(0、イオス::請う)を呼び出した後、次の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は間違っての使用ですか?

役に立ちましたか?

解決

あなたは悪いが、ストリーム内のビットセット持っているので、

あなたの問題が発生する。
不良ビットがリセットされるまで、ストリームの操作は無視されます。

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

注:A悪いビットはEOF

を含む多くのエラー条件の一つであります

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

あなたは、ファイルを読み取るためのClassic anti patternを使用しています。
むしろこれを使用します。

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

問題は、あなたがそれを過ぎて読まれるまで、EOFが設定されていないことである。
最後の有効な読み取りは件までを読み込んではなく、過去(したがって、EOF設定されていない)EOFます。

ですから、ファイルの最後の行を読んでいる状況を考えます。あなたはそれを過ぎて読んでいないようEOFが設定されていません。だから、ループが入力されます。あなたは今のgetlineを実行します()。絶対に読むべきデータ(ないシングルバイト)が存在しないため、この試みは過去のEOFを読み取ります。しかし、あなたは思えないので、それはおそらく、最後の行の値を読み出したが、今あなたが、その値は不定です(標準は、EOF条件がヒットしたときlineReadに何が起こるか言っていないlineReadを使用して)(getlineIDを呼び出している()が失敗したのgetlineので、 )ループ内にそれをリセットする。

このコードのもう一つの問題は、それが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の()は最初のパラメータとして渡されたストリームを返しますので、これは動作します。したがって、ストリームは、ブール値のコンテキストで使用されます。ストリームはブールコンテキストで使用される場合には、ブール値として使用することができるタイプに変換されます。エラーとそうでない場合はfalseがない場合、このオブジェクトの値がtrueと同等です。

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

他のヒント

ここに掲載し、さまざまなウェブサイトをトロール後、私はライン

を追加しました
m_fileIn.clear();

行の前に

getline (m_fileIn,lineRead);
エラーフラグをクリアすることによって、私は通常通り継続することができました(私はEOFエラーを仮定してい)ています。

マーティン - 私は本当に私が知らないうちに使用される抗パターンの詳細を知るために興味があると思い、私はあなたの変化、多くの感謝を含めるように自分のコードを更新しました。

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