1

大きなファイルf1を読んでいます: 10,000 行と 47,000 列。私がやりたいことは、f1を転置してf2に保存することです。

この問題を解決するために私がしたことは次のとおりです。

  • ステップ 1: f1を 1行ずつ読み取る
  • ステップ 2: 行をf2に書き込みます。これが、行ではなく列でf2を更新する問題です。

次の画像は、私が何をしたいのかを示しているので、1 行目を読み取ってファイル 2 に書き込みます。次に、2 行目を読み取って f2 に書き込みます (行ではなく列で) 。

質問:行ではなく列ごとに新しいファイルに書き込むにはどうすればよいですか?

これは私がこれまでのところです:

int main()
{

       int size = A.weightedKeys.size();
        ifstream file("f1.txt");
        ofstream fout("f2.txt");
        float x;
        for (size_t i = 0; i < size; i++)
        {
            vector<float> v;
            for (size_t j = 0; j < A.names.size(); j++)
            {
                file >> x;
                v.push_back(x);

            }
            //Each time that i have a new vector i want to add it by column to f2 not by rows
            for(size_t k = 0; k < v.size();k++ )
            {
               fout << v[k]<< endl;
            }
            v.clear();

        }
        fout.close();
}

ここに画像の説明を入力

4

1 に答える 1

1

ファイルは実際には、連続したバイトの大きな配列にすぎないため、ストレージに関する限り、「行」も「列」も概念はありません。「\n」の後に新しい行が始まると言っているだけです。

残念ながら、これは、ファイルの途中にデータを挿入できないため、列優先形式でファイルに書き込むことができないことも意味します。

私が考えることができる2つのオプション:

1)入力ファイル全体をメモリにロードし、転置された方法で書き出します(ユースケースでは最大2GBで問題ありません)。

2) 入力ファイルを 1 回読み取り、(tellg を使用して) 各行の開始をベクトルに格納し、次にベクトルを反復処理して (値に対して seekg を呼び出して) 新しいファイルを作成し、出力ファイルの読み取りと書き込みを行います。同時にベクトル内の位置を更新します。

于 2013-11-07T16:16:25.803 に答える