在零件中阅读文件,在最后阅读一段时间后继续
我一直在使用googling一段时间无济于事,我甚至不确定是否有这个名称。在零件中阅读文件,在最后阅读一段时间后继续
我的用例是:我有一个大文件,其中包含应该独立处理的文本块。它们全部列在文件中,并用分隔符分隔。我希望逐块读取该文件,并在读取块上执行一些操作,然后读取下一个块。像遍历文件一样,但不是一次全部读取到内存。我有java代码,通过某种实现可迭代接口的BlockGen类来实现,并在客户端代码需要时从先前读取的位置读取文件,但我不确定如何在C++中正确实现。
任何帮助表示赞赏。是的,这不是功课!
对于固定块大小,您可以使用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;
};
我认为就是这样,只要有一个ifstream类型的私人成员,可以“记住”它应该继续阅读的地方。我想知道如果这是足够干净.. – darxsys 2014-08-28 10:17:05
这是“干净”的意义上,如果任何崩溃的文件被关闭。如果每个块有两个分隔符,你可能需要绕过你忽略的那些线,但希望这足以让你开始。 – doctorlove 2014-08-28 10:23:21
是的,我对此并不是很熟悉。所以如果smth崩溃,文件将被关闭?除此之外,是的,这就是我一直在寻找的。谢谢。 – darxsys 2014-08-28 10:27:00
块是否固定大小?你如何习惯在C++中读取文件? – doctorlove 2014-08-28 08:28:09
它们被包含在某种分隔线中,因此我知道它们的开始和结束位置。我想将文件读取封装到一个单独的函数/类中,这样所有的getline东西都不在块处理函数中。理想情况下,块处理函数只会说blockgen.getNextBlock()或者像这样。 – darxsys 2014-08-28 08:29:31
也许你应该包含一些显示分隔符的示例文件。你可以使用内存映射文件或者一些缓冲(读取前面的内容)来获取每一行。 – firda 2014-08-28 08:32:02