将ifstream拆分为n个流?

时间:2020-02-07 13:52:30

标签: c++ stream ifstream istream seekg

我对ifstream有问题。我想将ifstream分成n个部分。

例如n = 3:

  1. Ifstream包含文件的前1/3。
  2. Ifstream包含文件的后1/3。
  3. Ifstream包含文件的三分之一。
    std::ifstream in("test.txt");
    std::vector<std::string> v1;
    std::vector<std::string> v2;
    std::vector<std::string> v3;

    //first 1/3 of file
    read(in, v1);
    //second 1/3 of file
    read(in, v2);
    //third 1/3 of file
    read(in, v3);

    read(in, v){

         std::string line {""};
         while(getline(in, line)){
              v.pushback(line);
         }
    }

2 个答案:

答案 0 :(得分:1)

您可以阅读并推动向量中的所有行,然后将向量分为3部分,例如:

std::string s;
while(!in.eof() && getline(in, s)) v1.push_back(s);
int size = v1.size(), itv2 = 0, itv3 = 0, chunk = v1.size()/3;
for(unsigned i = size-1; i >= size/3; --i, v1.pop_back()) 
    (i > chunk*2)? v3[chunk-itv3++] = v1[i] : v2[chunk-itv2++] = v1[i]; 

现在,如果您想对n个分区执行此操作,则可以执行以下操作:

//n must be defined before use
std::vector<std::vector<std::string> > vChunks(n+1);
std::vector<std::string> v;
std::string s;
while(!in.eof() && getline(in, s)) v.push_back(s);
int size = v.size(), chunk = v.size()/n, r = v.size()%n;
vChunks[n].resize(r);
for(int i = 0; i < n; i++)
    vChunks[i].resize(chunk);
for(int i = v.size()-1, it =1; it <= r; it++, --i, v.pop_back())
    vChunks[n][r-it] = v[i];
for(int i = v.size()-1; i >= 0; --i, v.pop_back())
    vChunks[(i%chunk == 0)? (i-1)/chunk : i/chunk][i%chunk] = v[i];

vChunks的前n个分区的行数为n个维,如果n + 1中的行不能被n个总行数除,则n + 1个行中的其余行为

答案 1 :(得分:1)

@ Mandy007通过预读所有内容到内存向您展示了一种简单的方法。

“干净”的方法是定义一个safely派生的类,该类将读取请求委派给基础的streambuf,但将查找位置和文件结尾指示操作为使它看起来像文件的区域是完整的流。

这是iostream库中自定义的工作方式...流类本身不是多态的,所有行为都来自istream实例。