C++ 分部分读取文件,在上次读取部分后继续

C++ 分部分读取文件,在上次读取部分后继续,c++,file-io,iteration,C++,File Io,Iteration,我已经在谷歌上搜索了一段时间,但都没有用,我甚至不知道这是否有一个名字 我的用例是:我有一个大文件,其中包含应该独立处理的文本块。它们都一一列在文件中,并用分隔符分隔。我想逐块读取该文件,对读取的块执行一些操作,然后读取下一个块。类似于迭代文件,但不是一次读取所有内存。我有java代码,它通过某种ButkGent类来实现,它实现了可迭代的接口,当客户端代码需要时,从先前读取的位置读取文件,但是我不太清楚如何在C++中实现这一点。 谢谢你的帮助。是的,这不是家庭作业 对于固定的块大小,可以使用if

我已经在谷歌上搜索了一段时间,但都没有用,我甚至不知道这是否有一个名字

我的用例是:我有一个大文件,其中包含应该独立处理的文本块。它们都一一列在文件中,并用分隔符分隔。我想逐块读取该文件,对读取的块执行一些操作,然后读取下一个块。类似于迭代文件,但不是一次读取所有内存。我有java代码,它通过某种ButkGent类来实现,它实现了可迭代的接口,当客户端代码需要时,从先前读取的位置读取文件,但是我不太清楚如何在C++中实现这一点。
谢谢你的帮助。是的,这不是家庭作业

对于固定的块大小,可以使用
ifstream::read

在您的情况下,推出您自己的
BlockGen

给出
的定义,例如
std::vector
,以及一个类(尽管为复制构造函数等提供了合适的定义)


积木的大小是固定的吗?您如何使用C++中的文件?它们被封装在一个分隔线中,所以我知道它们的起点和终点。我想将文件读取封装到一个单独的函数/类中,这样所有的getline内容就不在块处理函数中了。理想情况下,块处理函数只会说blockgen.getNextBlock()或类似的smth。也许您应该包含一些显示分隔符的示例文件。您可以使用内存映射文件或一些缓冲(提前读取某些内容)来获取其中的每一行。我认为就是这样,只要有一个ifstream类型的私有成员,它将“记住”应该继续读取的位置。我想知道这是否足够干净..如果有任何东西崩溃,文件被关闭,这就是“干净”的意思。如果每个块有两个分隔符,你可能需要绕着你忽略的线转一圈,但希望这足以让你开始。是的,我不太熟悉这一点。那么如果smth崩溃,文件会被关闭吗?除此之外,是的,这就是我要找的。谢谢。是的:-)雷伊。析构函数关闭了文件。因此,在堆栈展开过程中,它将被整理。
class BlockGen
{
    public:
    //boilerplate constructors, taking delimiter between blocks
    // opening input etc, etc

    Block getNextBlock()
    {
        Block block;
        std::string line;
        while( std::getline(input, line)  && line!=delimiter)
        {
            block.push_back(line);
        }
        return block;
    }

    private:
    std::ifstream input;
    std::string delimiter;
};