0

ifileの内容がラベルと一致しないため、コードが無限ループに陥ります。

ifileデバッグ中に、の内容がファイル全体を文字列として表していることに気付きました。

void Experiment::read_moveTo(ifstream* ifile, string label) {
    string temp;

    while (temp.compare(label) != 0 and ifile) {
        *ifile >> temp;

       if (ifile->eof()) {
            cout << "Read error: Could not find label '"
                 << label << "' while reading parameter file '"
                 << parameterFile << "'" << endl;
            exit(0);
        }
    }
}

ifileコンテンツがラベルと一致し、そのアドレスを指す出口が必要です。

4

1 に答える 1

0

std::ios_base::failbit問題は、ストリームが(ファイルに含まれていたものが原因で)抽出を実行できなかったため、ストリーム状態に設定されたことだと思います。これは、ストリームに対する後続の I/O 操作が何も行わないことを意味します。

ループから抜け出すための唯一の条件は、ポインターをチェックする初期条件です。

while (temp.compare(label) != 0 and ifile)
//                                  ^^^^^

ファイルの終わりのステータスを確認する場所:

if (ifile->eof())

この関数が呼び出される前に何かが原因で入力が失敗したと仮定すると (ファイルを開くことができなかったか、事前に無効な読み取りが実行されていた)、これらの条件はどちらもストリームを適切にチェックできません。最初の条件は、ポインターがゼロ以外の値であるかどうかを単純にチェックします。これは、ポインターが設定されていない場合に当てはまりますNULL(ここではこれを想定しています)。2 番目の条件は常に false です。これは、ストリームが設定される操作を実行できなくなるためstd::ios_base::eofbitです。

ストリームの状態を確認できるように、while ループでポインターを逆参照する必要があります。

while (temp.compare(label) != 0 and *ifile)
//                                  ^

これにより無限ループは修正されますが、この問題を完全に解決するには、ファイルの内容と、ストリームを作成して渡す方法についての詳細をあきらめる必要があります。

于 2014-01-10T17:07:36.497 に答える