1

これが私のコードです:

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main() {
    string line;
    ifstream inputFile;
    inputFile.open("input.txt");

    do {
        getline(inputFile, line);
        cout << line << endl;
    } while (line != "0");

    return 0;
}

input.txtの内容:

5 9 2 9 3
8 2 8 2 1
0

Enclipseでは、無限ループになります。MinGW 5.1.6 +EclipseCDTを使用しています。

いろいろ試してみましたが、問題が見つかりませんでした。

4

3 に答える 3

2

が正確に含まれている行がない場合は、無限ループが作成されます0。たとえば0\n、と同じものではありません0。私の推測では、それがあなたの問題だと思います。

編集:詳しく説明すると、getlineは改行を破棄する必要があります。おそらく、ファイルの改行エンコーディングが間違っています(つまり、WindowsとUNIX)。

于 2010-03-30T05:39:00.883 に答える
2

Windowsを使用しているので、次のことを試してください。

} while (line != "0\r");

最後の行はとして保存され"0\r\n"ます。は\ngetl​​ineによって行区切り文字として使用されるため、実際に読み取られる行は次のようになります。"0\r"

また

コマンドを使用して、dos形式のファイルをUNIX形式に変換できます。

dos2unix input.txt

これで、元のプログラムが機能するはずです。コマンドは\r\n、行末のをに変更します\n

また、ファイルを開こうとした後は、次のようなエラーチェックを常に実行する必要があります。

inputFile.open("input.txt");
if(! inputFile.is_open()) {
 cerr<< "Error opening file";
 exit(1);
}
于 2010-03-30T05:55:42.640 に答える
1

あなたの主な問題は作業ディレクトリです。
相対パスを使用してファイルを指定しているため、現在の作業ディレクトリからファイルが検索されます。作業ディレクトリは、開発環境で指定できます。(注:作業ディレクトリは、実行可能ファイルが存在するディレクトリと必ずしも同じではありません(これは初心者の間で一般的な仮定ですが、非常に特殊な状況でのみ保持されます))。

入力マーカー「0」の特別な終わりがありますが、getline()が失敗していないことも確認する必要があります(他の理由(ビーズ形式の入力を含む)でエラーが発生する可能性があるため)。そのため、通常は状態を確認するのが最善です。あなたがそれを読んだときのファイルの。

int main()
{
    string   line;
    ifstream inputFile;
    inputFile.open("input.txt");

    while((getline(inputfile, line)) && (line != "0"))
    {
        // loop only entered if getline() worked and line !="0"
        // In the original an infinite loop is entered when bad input results in EOF being hit.

        cout << line << endl;
    }
    if (inputfile)
    {
        cout << line << endl; // If you really really really want to print the "0"
                             // Personally I think doing anything with the termination
                             // sequence is a mistake but added here to satisfy comments.
    }

    return 0;
}
于 2010-03-30T06:47:15.887 に答える