Вы можете прочитать и вывести sh все строки в векторе, а затем разделить вектор на 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 общее количество строк