-1

ファイルを 1 行ずつ C++ で読み取り、各行を"\t"文字ごとに分割して行列を埋めたいと思います。私のコードは次のようになります

    ifstream data_x;
        double** test_data = new double*[100];
        for(int j = 0 ; j <  ; j++)
             test_data[j] = new double[4]; 

    data_x.open("X.txt");

    int i = 0;
    if (data_x.is_open()) 
    {
        while (!data_x.eof()) 
        {
            char** split = data_x.split("\t") 
            for(int k = 1 ; k < 4 ; k++)
                 test_data[i][k];
            i++;
        }
    }

    data_x.close();

    ifstream data_y;
    data_y.open("Y.txt");

    i = 0;
    if (data_y.is_open()) 
    {
        while (!data_y.eof()) 
        {
            data_y >> test_data[i][0];
            i++;
        }
    }

    data_y.close(); 

where 構文

 char** split = data_x.split("\t") 
 for(int k = 1 ; k < 4 ; k++)
      test_data[i][k];

は概算です。これを C++ で適切に作成するにはどうすればよいですか?

ありがとう

4

2 に答える 2

3

ファイルに数値のみが含まれていると仮定すると、標準の C++ イディオムは次のようになります。

#include <vector>
#include <string>
#include <sstream>
#include <fstream>

std::ifstream infile("data.txt");

std::vector<std::vector<double>> matrix;

for (std::string line; std::getline(infile, line); )
{
     std::istringstream iss(line);
     std::vector<double> row;

     for (double d; iss >> d; )
     {
         row.push_back(d);
     }

     matrix.push_back(row);
}

行列のサイズがわかっている場合は、関連するreserve呼び出しを追加して、ベクトルの再割り当てを回避できます。行に認識されないデータがあるかどうかのテストを追加することもできますが、今のところはこれで開始できます。

于 2012-10-05T15:55:13.423 に答える
0

空白で区切られたエンティティからベクトルを作成することは、実際には簡単です。

std::vector<T> fields(
    std::istream_iterator<T>(
        d::istringstream(line) >> std::skipws),
    std:.istream_iterator<T>()));

セルタイプTが区切り文字以外のスペースと見なされるものである場合は、変更されたファセット'\t'を使用してスペースと見なされるものを変更することをお勧めします。std::ctype<char>

明らかに、上記のロジックは、使いやすい機能にパッケージ化できます。

于 2012-10-05T17:34:40.107 に答える