1

FileReaderというクラスを作成しました。これは、このクラスの読み取り機能にあります。ファイルを開いて読み込みます。もちろん、ファイルの内容を私のクラスの「コンテンツ」という変数に入れます。最後の行にあります。

std::string file_content;
std::string temp;
std::ifstream file;

file.open(filepath,std::ios_base::in);

while(!file.eof()){

    temp.clear();
    getline(file, temp);

    file_content += temp;
    file_content += '\n';
}

file_content = file_content.substr(0, file_content.length()-1); //Removes the last new line

file.close();

content = file_content;

開いているファイルの内容は次のとおりです。

「こんにちは\nお元気ですか\nクール」.

もちろん、テキストファイルに正確に \n とは書きませんでした。しかし、ご覧のとおり、最後に新しい行はありません。

私の問題は、「コンテンツ」を画面に印刷するたびに、最後に改行があることです。しかし、最後の改行を削除しました...何が問題なのですか?

4

2 に答える 2

5

読んだ後ではなく読む前に使用する古典的なエラーeof。正解です

while (getline(file, temp))
{
    file_content += temp;
    file_content += '\n';
}

または、使用する必要がある場合は、前ではなくeofに使用することを忘れないでください。 getline

for (;;)
{
    getline(file, temp);
    if (file.eof()) // eof after getline
        break;
    file_content += temp;
    file_content += '\n';
}

eof次の読み取りで eof 問題が発生するかどうかを予測できると考える人がどれだけ多いかは驚くべきことです。しかしそうではなく、最後の読み取りに eof 問題があったことを示しています。これは C と C++ の全歴史を通してこのようなものでしたが、非常に多くの人がこの間違いを犯しているため、明らかに直観に反しています。

于 2013-03-29T21:17:40.253 に答える
4

eofファイルの末尾を超えて読み取ろうとするまで設定されません。ループは 3 行で 4 回繰り返されます。ただし、最後の反復ではデータは読み取られません。

これを行うより正しい方法は、while ループをwhile (std::getline(file, temp));に変更することです。これにより、3回目の読み取りの後、ファイルの最後に到達するとループが終了します。

于 2013-03-29T21:17:31.033 に答える