0

つまり、基本的には、一連のデータを取り込み、結果を構造体のベクトルに入力するプログラムを作成しています。ただし、私が抱えている問題は、メイン関数にある while ループでファイルの終わりフラグが設定されないことです。

int main()
{
ifstream machineRecords;
machineRecords.open ("records.txt");
if (machineRecords.fail())
{
    cout << "Failed to open \'records.txt\' please make sure it is in the same directory as the executable.";
    exit(1);
}

char tempChar;
string record;
do
{
    int LINE = 0;
    for (int x = 0; x <= 11; x++)
    {
        cout << "Begin storing characters in record" << endl;
        do  //Stores one character at a time into the node string until it discovers the end of the node
        {
            tempChar = machineRecords.get();
            record += tempChar;
            cout << "||" << tempChar << endl;
            //_getch();
        } while (tempChar != '|' && tempChar != '\n');
        eraseCharFromString(record, '|');       //Removes ending tag character
        eraseCharFromString(record, '\n');  //Removes any sneaky newline characters

        cout << "Record: " << record << endl;

        switch(x)
        {
            case 0:
                machines[LINE].idNumber = atoi(record.c_str());
                break;
            case 1:
                machines[LINE].description = record;
                break;
            case 2:
                machines[LINE].purchaseDate.month = atoi(record.c_str());
                break;
            case 3:
                machines[LINE].purchaseDate.day = atoi(record.c_str());
                break;
            case 4:
                machines[LINE].purchaseDate.year = atoi(record.c_str());
                break;
            case 5:
                machines[LINE].cost = atof(record.c_str());
                break;
            case 6:
                machines[LINE].history.failRate = atof(record.c_str());
                break;
            case 7:
                machines[LINE].history.downDays = atoi(record.c_str());
                break;
            case 8:
                machines[LINE].history.lastServiced.month = atoi(record.c_str());
                break;
            case 9:
                machines[LINE].history.lastServiced.day = atoi(record.c_str());
                break;
            case 10:
                machines[LINE].history.lastServiced.year = atoi(record.c_str());
                break;
        }
        record = "";
        _getch();
    }

    tempChar = machineRecords.get();
    if (machineRecords.fail())
    {
        cout << "DONE" << endl;
        break;
    }
    else
    {
        machineRecords.putback(tempChar);
    }

    ++LINE;
    _getch();
} while (!machineRecords.eof());    //While not at the end of the file

recordFromLastDate(1999);

machineRecords.close();
_getch();
return 0;
}

フォーマットエラーはSOの問題です。

とにかく、各行の後に別の文字をテストして読み取ろうとしても、単に eof フラグをトリガーしません。なぜそうならないのか、私にはまったくわかりません。

残念ながら、中間テスト用の他のプロジェクトが山ほどあるため、あまり多くのコードを書き直す時間はありません。

4

3 に答える 3

1

EOFは、ファイルの終わりを超えて文字を読み取るときにのみ設定されるため、EOFが設定された後machineRecords.get()は戻り値をテストしないと考えるのが賢明です。したがって、後続の読み取りではストリームの失敗ビットが設定され、EOFは無視されます。machineRecords.get()続行する前にEOFまたはエラーをキャッチするために-1でのテスト結果だけ

于 2012-10-14T01:08:55.263 に答える
1

次のようなことを試してみるとよいと思います。

char ch;
ifstream ifile("filename");

ifile.get(ch);   /*Called as prime read. Use getline() or ifile>>line where line is a string depending on your requirement*/
while(ifile)
{
do your work;//
......
......
......
ifile.get(ch);
}

これは、ほとんどすべてのタイプのファイルで機能します。最初にストリームからデータを取得し、ループの開始時にストリームの状態をチェックしwhileます。失敗した場合は、whileループの後にステートメントEOFをすぐに実行します。ストリームが失敗状態に入る場所に到達しました。

于 2012-10-14T01:04:47.650 に答える
-1

あなたは使用する必要があります

} while (!machineRecords.good()); 

あなたの最終的な条件として。

eofbitだけでなく、eofbit、failbit、badbitをカバーしているため、以前に読み取りに失敗したためにeofに到達しなかった場合も、ループは終了します。

ここで調べることができます:http ://www.cplusplus.com/reference/iostream/ios/good/

于 2012-10-14T01:08:29.003 に答える