C++ 将IFN流拆分为多个流?

C++ 将IFN流拆分为多个流?,c++,stream,ifstream,istream,seekg,C++,Stream,Ifstream,Istream,Seekg,我对ifstream有问题。我想把ifn流分成几个部分 例如,n=3: Ifstream包含文件的前1/3 Ifstream包含文件的第二个1/3 Ifstream包含文件的第三个1/3部分 std::ifstream-in(“test.txt”); std::向量v1; std::向量v2; std::vectorv3; //文件的前1/3 读取(in,v1); //文件的第二个1/3 读(in,v2); //第三个1/3文件 读(in,v3); 读(in,v){ std::字符串行{“”};

我对ifstream有问题。我想把ifn流分成几个部分

例如,n=3:

  • Ifstream包含文件的前1/3
  • Ifstream包含文件的第二个1/3
  • Ifstream包含文件的第三个1/3部分
  • std::ifstream-in(“test.txt”);
    std::向量v1;
    std::向量v2;
    std::vectorv3;
    //文件的前1/3
    读取(in,v1);
    //文件的第二个1/3
    读(in,v2);
    //第三个1/3文件
    读(in,v3);
    读(in,v){
    std::字符串行{“”};
    while(getline(in,line)){
    v、 推回(线);
    }
    }
    
    您可以读取并推送向量中的所有行,然后将向量拆分为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];
    
    //n必须在使用前定义
    标准:向量vChunks(n+1);
    std::向量v;
    std::字符串s;
    而(!in.eof()&&getline(in,s))v.向后推;
    int size=v.size(),chunk=v.size()/n,r=v.size()%n;
    vChunks[n]。调整大小(r);
    对于(int i=0;i

    其中
    vChunks
    前n个分区具有n维之间的行数,而在n+1中,如果不可被n整除,则具有最后一行的剩余行数。总行数@Mandy007向您展示了一种简单的方法,将所有内容预读入内存

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


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

    对不起,有很多方法。是否要返回3个ifstreams,是否只需执行3次读取?需要更多详细信息。我想从流中的某些点执行3次读取,因此有方法seekg()和tellg(),可以帮助您找出文件的大小(以字节为单位),然后返回并读取并测试是否达到1/3或2/3。它们不会是精确的,因为行可能不会精确地分割文件。如果要按行数拆分,只能通过将整个文件读入一个行向量,然后拆分该向量来完成。问题是我无法在read()内操作或更改参数。有没有办法只传递2/3的ifstream?然后创建三个ifstream。获取文件的大小。将第二个ifstream搜索到文件的1/3,将第三个ifstream搜索到文件的2/3。是的,您必须创建3个独立的ifstream,因为ifstream只能有一个状态,而且不能被复制。
    //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];