2

それで、私と私のグループメートは突然手元にいくつかのクラッチワークを持っています。私は、次のようなテキストファイルを読み取り、それを2D配列に格納するインポート関数を作成するように割り当てられました。 ここに画像の説明を入力してください

列はタブ区切りです。これが突然起こったので、プロジェクトファイル全体を私と一緒に持ってはいけません、そして私は私の古い信頼できるものにほど遠いです、私はこれを可能な限り最も一般的な方法で思い起こさせようとしました:

void signal::import_data(string filename){
    ifstream file;

    file.open(filename.c_str());

    if(file.fail()){
        cerr << "file open fail" << endl;
    }else{
        while(!file.eof)
        {
            for(int j = 0; j < NumCols; j++){
                for(int i = 0; i < NumRows; i++){
                    file >> _data[j][i];
                }
            }
        }
    }
    file.close();
}

私はこれを正しくやっていますか?このようなストリーミングでタブをバイパスできるかどうかはわかりませんか?

4

1 に答える 1

3

私はこのコードだと思います:

while(!file.eof)
{
   for(int j = 0; j < NumCols; j++){
       for(int i = 0; i < NumRows; i++){
              file >> _data[j][i];
      }
   }
}

これに置き換える必要があります:

for(int j = 0; j < NumCols; j++)
{
   for(int i = 0; i < NumRows; i++)
   {
         if ( !(file >> _data[j][i]) ) 
         {
             std::cerr << "error while reading file";
             break;
         }
   }
   if ( !file ) break;
}

つまりNumCols * NumRows、ファイル内にエントリがあると予想される場合、ファイルの終わりを明示的にチェックする必要はありません。NumCols * NumRowsエントリが読まれるまで読ませてください。読み取りが完了すると、自動的にループから抜けます。

ただし、エントリが読み取られる前 にファイルが終了しているかどうかを確認する必要があるため、次のようにしています。NumCols * NumRows

if ( !(file >> _data[j][i]) ) 
{
    std::cerr << "error while reading file";
    break;
}

ファイルがエントリの読み取りを完了する前にeof文字、またはその他の読み取りエラーに達した場合、 の条件が評価され、エラー メッセージが出力されてループが中断され、式が次のように外側のループも中断されます。に評価します。NumCols * NumRowsiftrue!filetrue

C++ ストリームを使用してファイルを読み取る方法の詳細については、次のトピックの回答を参照してください。

于 2013-01-26T16:58:33.767 に答える