在ifs()C ++中快速访问文件位置

时间:2018-07-04 15:44:40

标签: c++ parsing ifstream seekg

信息:将位置存储在txt文件中,关闭文件并随后使用c ++在同一位置打开它的最佳方法是什么?

我有一个很大的文本文件,需要将其分块解析并输入某些系统。到目前为止,我先将文件加载到ifstream中,然后再加载行,直到找到所需的数据为止(假设数据位于{x}位置)。此后,我关闭文件,处理数据,现在我需要继续从大文件中馈送数据。因此,我再次打开文件,并获取行,直到我这次到达{x + d}的位置(d是我读取的数据的偏移量)...

很容易看出,我遍历文件是(1d + 2d + ... +(N-1)d + Nd)〜d * N ^ 2次。现在我想在d之后将位置保存在文件中,关闭文件,然后立即在同一位置打开文件。有什么用呢?

1 个答案:

答案 0 :(得分:3)

您无法在启用换行符转换(标准称为“文本模式”)的情况下执行此操作,因为返回该位置要求标准库扫描文件的整个开头以找到N个字符,而不是重复计数换行符。可变长度编码的翻译(例如,在UTF-8和UCS之间)会导致类似的问题。

解决方案是关闭换行符翻译(标准称为“二进制模式”)和其他任何涉及可变长度编码的翻译,然后自行处理。关闭所有转换后,“文件位置”是OS直接用于执行文件I / O的数字,因此可能具有很高的效率(实际上是否有效取决于标准库实现细节)。