将 ifstream 拆分为 n 个流?



我在使用 ifstream 时遇到问题。我想将 ifstream 分成 n 个部分。

例如 n = 3:

  1. Ifstream 包含文件的前 1/3。
  2. Ifstream 包含文件的第二个 1/3。
  3. Ifstream 包含文件的第三个 1/3。
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);
}
}

您可以读取并推送向量中的所有行,然后将向量分成 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 整除,则最后几行的其余部分

具有行总数

@Mandy007向您展示了一种简单的方法,即将所有内容预读到内存中。

执行此操作的"干净"方法是定义一个streambuf派生类,该类将读取请求委托给底层istream,但操作查找位置和文件结束指示,使其看起来像文件的区域是一个完整的流。

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

最新更新