0

次のコードを実行し、たとえば「Peter」と書くと、ファイルに「PeterPeter」が含まれます。

なんで?

#include "stdafx.h"
#include "iostream"
#include "iomanip"
#include "cstdlib"
#include "fstream"
#include "string"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ofstream File2;
    File2.open("File2.dat",ios::out);

    string name;
    cout<<"Name?"<<endl;
    while(!cin.eof())
    {
        cin>>name;
        File2<<name;
    }
    return 0;
}

whileループを次のように変更すると

while(cin>>name)
{
    File2<<name;
}

できます。しかし、最初のアプローチがそうでない理由がわかりません。

私は自分の質問に答えることができません (十分な評判がないため)。したがって、ここに私の答えを書きます:

ああああ!!! わかりました ありがとうございます。今わかりました^^

私はでテストしてきました

    while(!cin.eof())
{
    cin>>name;
    File2<<name;
    cout<<j++<<"cin.eof() "<<cin.eof()<<endl;
}

何が起こるかというと、私がcrtl+zを傾けると、彼はまだ while ループの中にいるということです。変数名は変更されず、次のコード行で「File2」に追加されます。

以下が機能しています:

while(!cin.eof())
{
    cin>>name;
    if(!cin.eof()){File2<<name;}
    cout<<j++<<"cin.eof() "<<cin.eof()<<endl;
}
4

2 に答える 2

1

ループ条件での使用の基本的な問題は、std::cin.eof()ストリームから何かを読み取ろうとする前にストリームの状態をテストすることです。この時点で、ストリームは何を読み取ろうとしているのか分からず、何を読み取ろうとしているのかを予測することもできません。基本的な洞察は次のとおりです。データを読み取った後、データの読み取りが成功したことを常に確認する必要があります。

二次的な問題はeof()、複数のエラー状態の 1 つだけをテストすることです。a の読み取りstd::stringは、それ以上データがない場合にのみ失敗する可能性がありますが、他のほとんどのデータ型でもフォーマット エラーが発生します。たとえばint、フォーマットの不一致があったために、 の読み取りがうまくいかない場合があります。その場合、std::ios_base::failbitが設定され、fail()戻り続けtrueながらeof()戻りfalseます。

ストリーム自体をテストfail()することは、ストリームに問題があることを検出するテストと同じです (実際には、ストリームが であるかどうかもテストしますbad())。したがって、ファイルを読み取る標準的なアプローチには、通常、次のいずれかの形式があります。

while (input) {
     // multiple read operations go here
     if (input) {
         // processing of the read data goes here
     }
}

また

while (/* reading everything goes here */) {
    // processing of the read data goes here
}

for明らかに、 -loop の代わりに -loopを使用できますwhile。データを読み取るもう 1 つの興味深いアプローチstd::istream_iterator<T>では、 type の入力演算子があることを前提としていますT。例えば:

for (std::istream_iterator<std::string> it(std::cin), end; it != end; ++it) {
    std::cout << "string='" << *it << "'\n";
}

これらのアプローチのいずれもeof()、メインの読み取りループでは使用されません。eof()ただし、ファイルの終わりに達したためにループが停止したか、フォーマット エラーがあったためにループが停止したかを検出するために、ループの後に使用することは合理的です。

于 2013-09-21T09:28:04.830 に答える