1

を入力した後getline、入力ファイルの最初の行の数値は無視され、プログラムは2行目から最後まで開始されます。

コードは次のとおりです。

while (!file.eof())
{
    getline(file, lineBuffer);
    if(lineBuffer.length()==0)
    {
        continue; //ignore empty lines
    }
    else 
    {
       // file.open("test.txt");
        while (file >> A >> B >> N)
        {

            for(int count=1; count<=N; count++)
            {
                if(count%A == 0 && count%B == 0) { cout << "FB "; }

                else if(count%A == 0) { cout << "F "; }

                else if(count%B == 0) { cout << "B "; }

                else { cout << count << " "; }

            }
            cout << endl;
        }
    }
}

入力ファイルには3行の整数が含まれ、2行目と3行目のみが処理されます。私はこれを広範囲に調べましたが、私のようなケースについては誰も言及していません。通常、関数の後にユーザー入力を取得しようとする人々を扱いgetlineます。任意のアイデアをいただければ幸いです。

4

2 に答える 2

2

getline(file, lineBuffer)から行を読み取り、fileに格納しlineBufferます。それを使用したい場合は、 (最初の行がすでにスキップされている)lineBufferから読み取る代わりに処理する必要があります。file機能させるには、単純に inner の外側のすべてのコードを削除しますwhile。これはファイルから一度に 3 つの数字を読み取り、そのうちの 1 つを抽出するのに失敗すると停止します。

于 2013-02-07T08:45:01.837 に答える
0

上記のコードは本物ですか、それとも例ですか?

それが本当なら、空行をスキップする必要はありません。operator>> は空白をスキップします。

行をスキップしない次のコードは、「AB N」行の同じ読み取りを実行します。

// outer loop is not needed, either remove it, or include error checking
// while (!file.eof() && !file.fail())
{
    while (file >> A >> B >> N)
    {
        for(int count=1; count<=N; count++)
        {

            if(count%A == 0 && count%B == 0) { cout << "FB "; }
....

なんらかの理由で getline をまったく削除できない場合は、getline が常に行を読み取ることを思い出してください (ストリームポインタが最後に達しない限り)。これは、コードが空の行をスキップしてから、最初の空でない行を読み取り、その行が空ではないことに気づき、ループを中断することを意味します。line を読み取ったため、データの最初の行はlinebufferにあり、ストリームにはありません。ここで、行全体を取得する (ストリームがサポートしている場合) か、行の長さだけストリームを巻き戻す(ストリームがサポートしている場合) か、たとえば istringstream クラスを使用してからデータを読み取るだけです。

一般に、getline と operator>> を混在させることは可能ですが、注意が必要です (特に、最初に >> を介して読み取り、次に 1 行または 2 行をスキップしたい場合)。これは、バッファリングと空白処理の点で動作が少し異なるためです。本当にそれが必要な場合は、この件名を検索してください。それらを同期する方法の例がたくさんあります。

于 2013-02-07T08:46:04.020 に答える