1

我正在阅读一个大文件f1:10,000 行和 47,000 列。我想要做的是转置f1并保存到f2

为了解决这个问题,我做了以下事情:

  • 第 1 步:逐行读取f1
  • 第 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'之后开始。

不幸的是,这也意味着您无法以列优先格式写入文件,因为您无法将数据插入文件中间。

我能想到的两个选择:

1)将整个输入文件加载到内存中,然后以转置方式将其写出(您的用例约为 2GB,应该没问题)。

2) 通读输入文件一次,将每行的开头(使用tellg)存储在向量中,然后通过迭代向量(在值上调用 seekg)创建新文件,然后读取和写入输出文件,同时更新向量中的位置。

于 2013-11-07T16:16:25.803 回答