在零件中阅读文件,在最后阅读一段时间后继续

问题描述:

我一直在使用googling一段时间无济于事,我甚至不确定是否有这个名称。在零件中阅读文件,在最后阅读一段时间后继续

我的用例是:我有一个大文件,其中包含应该独立处理的文本块。它们全部列在文件中,并用分隔符分隔。我希望逐块读取该文件,并在读取块上执行一些操作,然后读取下一个块。像遍历文件一样,但不是一次全部读取到内存。我有java代码,通过某种实现可迭代接口的BlockGen类来实现,并在客户端代码需要时从先前读取的位置读取文件,但我不确定如何在C++中正确实现。

任何帮助表示赞赏。是的,这不是功课!

+0

块是否固定大小?你如何习惯在C++中读取文件? – doctorlove 2014-08-28 08:28:09

+0

它们被包含在某种分隔线中,因此我知道它们的开始和结束位置。我想将文件读取封装到一个单独的函数/类中,这样所有的getline东西都不在块处理函数中。理想情况下,块处理函数只会说blockgen.getNextBlock()或者像这样。 – darxsys 2014-08-28 08:29:31

+0

也许你应该包含一些显示分隔符的示例文件。你可以使用内存映射文件或者一些缓冲(读取前面的内容)来获取每一行。 – firda 2014-08-28 08:32:02

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

在你的情况,也不会太硬推出自己的BlockGen

给出的定义Block例如一个std::vector<std::string>,和一个类(适合虽然给予复制构造等)

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; 
}; 
+0

我认为就是这样,只要有一个ifstream类型的私人成员,可以“记住”它应该继续阅读的地方。我想知道如果这是足够干净.. – darxsys 2014-08-28 10:17:05

+0

这是“干净”的意义上,如果任何崩溃的文件被关闭。如果每个块有两个分隔符,你可能需要绕过你忽略的那些线,但希望这足以让你开始。 – doctorlove 2014-08-28 10:23:21

+0

是的,我对此并不是很熟悉。所以如果smth崩溃,文件将被关闭?除此之外,是的,这就是我一直在寻找的。谢谢。 – darxsys 2014-08-28 10:27:00