-1

重複の可能性:
stream.good()または!stream.eof()をテストすると、最後の行が2回読み取られます

ファイルからリンクリストにデータを読み込む必要がある割り当てに取り組んでいます。これまでのところ、ファイルをリンクリストに問題なく読み込むことができますが、ファイルからリストに読み込むたびに、追加のエントリが1つ表示されます。

これが私の構造です:

struct Video { 
char video_name[1024];      // video name
int ranking;                // Number of viewer hits
char url[1024];             // video URL
YouTubeVideo *next;  // pointer to Video structure
}  *head = NULL;        // EMPTY linked list

これが私の読み込みコードです:

void load()
{
ifstream rankFile ("Ranking.dbm");
struct Video *temp;
if (rankFile.is_open())
{
    string line;
    do {

        temp = (Video*)malloc(sizeof(Video)); //allocate space for node 
        temp->next = head;
        head = temp;
        rankFile.getline(temp->video_name,1024);
        rankFile >> temp->ranking;
        getline(rankFile, line); // need to skip 'ranking's
        // unread new-line
        rankFile.getline(temp->url,1024);


    }while (rankFile.good() );

    rankFile.close();
}

else cout << "Unable to open file"; 

return ;

}

次のようなファイルから読み取っています。

spiderman
100
spiderman.com
lucy
30
lucy.com
disney
1200
disney.com

これらはすべて正常に読み取られますが、do-while(rankFile.good());ループがもう1回繰り返され、リンクリストに空のノードが表示されます。私はすでにすべてのgetline()ステートメントをwhileループの条件として使用しようとしましたが、それは何も変わらないようです。また、使用しrankFile != eofても運がありませんでした。

\n次のI/Oをチェックして、ファイルの終わりではないことを確認する方法はありますか?

4

2 に答える 2

2

構文while(rankFile.good())を使用する代わりにに変更してください。ループの内容が処理を終了するまで、最後の反復で終了条件を評価しません。単純なものは、ループ本体を処理する前に評価します。do...whiledo...whilewhile

于 2012-10-12T18:13:11.097 に答える
0

Do-whileループが最初に実行され、その後条件がチェックされます。したがって、最初のステップよりも常に1ステップ多く、ループは常に実行されます。whileループは、本体を実行する前にまず条件をチェックします。したがって、余分な反復はありません。

こちらで確認してください。

http://www.cplusplus.com/doc/tutorial/control/

于 2012-10-12T18:17:20.020 に答える