1

カスタム クラス Customer で operator>>() 関数をオーバーロードすることにより、トークン化されたデータをテキスト ファイルからポインターのベクトルに読み取ろうとしています。私のコードはファイル全体を読み取るために正常に動作しますが、終了するとセグフォルトが発生します

ここに私のコードがあります:

int line = 0;
vector<Customer *> customers;
ifstream fin("customers.txt", ios_base::in);

while (fin)
{
    Customer *temp = new Customer();
    line++;
    try
    {
        fin >> *temp;
        customers.push_back(temp);
    }
    catch(boost::bad_lexical_cast&)
    {
         cerr << "Bad data found at line " << line
             << " in file customers.txt" << endl;
    }
}

オーバーロードされた operator>>() 関数が getline() で行を読み取るように機能し、そのデータを Customer への一時ポインターに挿入し、無効なデータが見つかった場合は bad_lexical_cast をスローすると仮定します。

私は変更できることに気づきました:

while (fin)

に:

while (fin >> *temp)

しかし、不良データが見つかった場合は、その行をスキップして次の行に進むように、try/catch ブロックを保持したいと考えています。

実際に引っ張らずに次の行があるかどうかをテストするためにできることはありますか? スキャナ クラスの java hasNextLine に似ていますか?

どんな助けでも大歓迎です

4

1 に答える 1

1

の出力を確認する必要がありますfin >> *tempfalse読み取りに失敗した場合 (つまり、ファイルの終わり) に戻ります。

その行を次のように変更できます。

if(!(fin >> *temp)) break;

(同様の問題/質問に対する回答については、こちらも参照してください。)

于 2013-10-16T11:00:42.933 に答える