テキストファイルからの読み取り時のgetlineを使います
質問
私は当初、それは既知のヘッダ宣言(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エラーを仮定してい)ています。
マーティン - 私は本当に私が知らないうちに使用される抗パターンの詳細を知るために興味があると思い、私はあなたの変化、多くの感謝を含めるように自分のコードを更新しました。
。