1

プログラムをテキストファイルの行末まで読み取ろうとして問題が発生しました。

次の形式(スペースで区切られたフィールド)でテキストファイル(1行に1つのアイテム)からデータを読み取ろうとしています。

  • 家(12345)
  • タイプ(A=自動またはM=モーターサイクル)
  • ライセンス(WED123)
  • 年(2012)
  • msrp(23443)

データは、車両登録の合計を計算するために使用されます。

現在、プログラムは上記のようにフォーマットされたすべての行を読み取っていますが、家には複数の車両が存在する可能性があるため、行に追加のデータがあります(この場合、最初のフィールドを除くすべてが繰り返されます)。例えば:

111111 A QWE123 2012 13222 M RTW234 2009 9023

//     ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
//        first vehicle      second vehicle

追加のデータがある行に到達すると、プログラムはそれを読み取らず、無限ループに入ります。行の追加データを読み取ってファイルの最後に到達し、プログラムを無限ループから停止するにはどうすればよいですか。

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

using namespace std;

int main ()                   // Function Header
{                             // Start Function
    int house;
    char  type; 
    string license; 
    int year, msrp ; 
    char ch; 

    ifstream inData; 
    ofstream outData; 

    inData.open("register.txt"); 
    outData.open("vehicle.txt"); 

    inData >> house;               // Priming Read

    while (inData) {             // Test file stream variable

        do { 
            inData >> type;         
            inData >> license; 
            inData >> year;
            inData >> msrp; 

            outData << house << type << license << year << msrp << endl; 

            ch = inData.peek();
            inData >> house;

        } while(ch != '\n');            // Check for end of line 

    }                              // End while 

    system ("Pause");      
    return 0;
}
4

2 に答える 2

1

プログラムは、行の終わりを検出するのに苦労します。「余分なデータ」を読み取ろうとしたが、代わりに次の行が検出されると、ストリームでエラーが発生し、再度読み取ることができなくなります。

house内側のループの値を読み取らないことで、プログラムを「修正」できます。代わりに、行末を検出してから読んでください。

        ch = inData.peek();
        //inData >> house;          // WRONG: house might be next vehicle type

    } while(ch != '\n');            // Check for end of line 

    inData >> house;                // CORRECT

}                              // End while 

ただし、これを処理するためのより良い方法は、とを使用することgetlineですistringstream。まず、。を使用して入力の行全体を取得しgetlineます。入力をに配置しますistringstream。次に、そこから残りのデータを取得します。この例については、MMのバージョンを参照してください。

于 2013-03-10T16:49:30.853 に答える
0

私があなたの質問を正しく理解しているなら、あなたは以下のサンプルを使うことができます。

最初に読み取り、house次にtype、、、、licenseを読み取る場合。yearmsrp

string line;
while (getline(inData , line))
{
    istringstream iss(line, istringstream::in);

    iss >> house;
    while (iss >> type >> license >> year >> msrp)
    {
      outData << house << type << license << year << msrp << endl; 
    }
}
于 2013-03-10T16:36:05.077 に答える