2

テキスト ファイルには、次のような形式の行が含まれています。

lSdhmhlN   15479   6694.74   O
szUfGnoI   18760   5275.53   n

ファイルを 1 行ずつ読み取り、そのデータをバッファー変数に入れ、それらの変数を TopicD オブジェクトに格納し、そのオブジェクトを二分探索ツリーに挿入しています。問題は、ファイルの最後の行が 2 回読み取られるため、2 つの同一の TopicD オブジェクトが作成されてツリーに挿入されることです。なんで?

これが私のコードです:

template<class ItemType>
void read( BinarySearchTree<ItemType> & tree )
{
ifstream read( FILE_NAME.c_str() );

if ( read.fail() )
    die( "Error opening the file." );

string strbuff;
double dubbuff;
int intbuff;
char chbuff;

while ( !read.eof() )
{
    read >> strbuff;
    read >> intbuff;
    read >> dubbuff;
    read >> chbuff;
    TopicD buff( strbuff, dubbuff, intbuff, chbuff );
    tree.add(buff);
}

read.close();
}
4

1 に答える 1

3

そのループから少しだけ切り取ることを検討してください。

while (read >> strbuff >> intbuff >> dubbuff >> chbuff)
    tree.add(TopicD( strbuff, dubbuff, intbuff, chbuff ));

EOFに到達.eof()したときに、真であるとは決して信頼しないでください。むしろ、とりわけ、そこに着いたらもう一度読み込もうとすると、それは真実になります。したがって、EOFに到達した後の最初の読み取りは失敗しますが、その時点でエラーのチェックを停止し(ちなみに、最初はチェックしていませんでした)、変数にあるものを盲目的にツリーに挿入します。

于 2013-03-18T07:23:38.450 に答える