0

ファイルから会社のデータを読み取り、エラーを処理する宿題をしています。

これまでのところ、最初の行で機能すると思いますが、各行を読み上げる方法がわかりません。各行は、ID、名前、および支払いを含むレコードです。基本的に、最初の行を処理した後、次の行にスキップする方法を知りたいです。エラー チェックはまだ含めていませんが、1 レコードが読み取られた後の最後の do while ループになると思います。各変数に読み込まれた情報が間違っている場合は、それをチェックして、サマリー ファイルまたはエラー ファイルに出力できます。

void processFile()
{
  string filename;
  ifstream recordFile;
  ofstream summary("summary.dat");
  ofstream error("error.dat");

 cout << "Please enter a filename\n";

 do
 {
    cin >> filename;
    recordFile.open(filename);
    if (!recordFile.is_open())
    cout << "No file by that name. Please enter another filename\n";  
 }
 while(!recordFile.is_open());

 int ID = 0;
 string firstName;
 string lastName;
 double payment1, payment2, payment3 = (0.00, 0.00, 0.00);
 string numberOfRecords;
 getline(recordFile, numberOfRecords);

 do
 {
     ws(recordFile);
     recordFile >> ID;
     recordFile >> firstName;
     recordFile >> lastName;
     recordFile >> payment1;
     recordFile >> payment2;
     recordFile >> payment3;

 }
 while(!recordFile.eof());
}

*編集: 問題の一部を見つけました。実際には、最初の行をスキップして、その時点から読み進める必要があります。各ファイルの最初の行には、役に立たないデータが含まれています。

4

2 に答える 2

1

オブジェクトでgetline関数を使用するifstream

于 2012-10-09T16:41:31.120 に答える
0

2つのこと。1つ目は、複数のレコードを読み取る必要があり、各レコードが新しい行である場合、ほとんどの場合、を使用して行ごとに読み取り、をstd::getline使用 std::istringstreamして行(レコード)をに分割するのが最善の解決策です。必要なフィールド。これには、エラーが発生した場合でも入力の同期を維持できるという利点があります。どれだけ先に進んだり無視したりするかを心配する必要はありません。

2番目のポイントは、をチェックしているということですeof()。これはほとんどの場合エラーです。1行を読みすぎる場合もあれば、最後の行またはフィールドを無視する場合もあります。入力が成功した場合(そして、ファイルの終わりを確認できるのは、それを超えて入力を試みたでのみ可能です )、ストリームは条件付きコンテキストでtrueとして動作します。そうでない場合は、falseとして動作します。したがって、ループは次のようになります。

std::string line;
while ( std::getline( recordFile, line ) ) {
    std::istringstream record( line );
    record >> ID;
    if ( ! record ) ...
    //  ...
}

最後に、すべての>>演算子で先頭のスペースが削除されるため、を呼び出す必要はありませんws。一方、上記のスキーマでは、次のようなことを行うことができます。

if ( record >> ws && record.get() != EOF ) {
    //  Unexpected garbage at end of line...
}

ループの最後で、余分なテキストがないことを確認します。

于 2012-10-09T17:00:13.310 に答える