在 ifs() C++ 中快速访问文件位置
Fast accessing file position in ifs() C++
信息:在 txt 文件中存储位置、关闭文件并稍后使用 C++ 在同一位置打开它的最佳方法是什么?
我有一个很大的文本文件,我需要将其分块解析并输入到某个系统中。截至目前,我将文件加载到 ifstream 中,然后获取行,直到找到我需要的数据(假设数据位于位置 {x})。之后我关闭文件,处理数据,现在我需要继续从大文件中获取数据。所以我再次打开文件,然后获取行,直到我这次到达 {x+d} 位置(d 是我读取的数据的偏移量)...
我没有遍历一次文件,很容易看出,我遍历了 (1d + 2d + ... + (N-1)d + Nd) ~ d*N^2 次文件。现在我想保存文件中d之后的位置,关闭文件,然后在同一位置立即打开文件。这有什么用?
你不能在启用换行符翻译的情况下执行此操作(标准称之为 "text mode"),因为返回该位置需要标准库扫描整个文件的前面以找到 N 个字符-不重复计算换行符。可变长度编码的翻译(例如在 UTF-8 和 UCS 之间)会导致类似的问题。
解决方案是关闭换行符翻译(标准称之为 "binary mode")和任何其他涉及可变长度编码的翻译,并自行处理。在关闭所有翻译的情况下,"file position" 是 OS 直接用来执行文件 I/O 的编号,因此有可能非常高效(实际上是否有效取决于标准库实现细节)。
信息:在 txt 文件中存储位置、关闭文件并稍后使用 C++ 在同一位置打开它的最佳方法是什么?
我有一个很大的文本文件,我需要将其分块解析并输入到某个系统中。截至目前,我将文件加载到 ifstream 中,然后获取行,直到找到我需要的数据(假设数据位于位置 {x})。之后我关闭文件,处理数据,现在我需要继续从大文件中获取数据。所以我再次打开文件,然后获取行,直到我这次到达 {x+d} 位置(d 是我读取的数据的偏移量)...
我没有遍历一次文件,很容易看出,我遍历了 (1d + 2d + ... + (N-1)d + Nd) ~ d*N^2 次文件。现在我想保存文件中d之后的位置,关闭文件,然后在同一位置立即打开文件。这有什么用?
你不能在启用换行符翻译的情况下执行此操作(标准称之为 "text mode"),因为返回该位置需要标准库扫描整个文件的前面以找到 N 个字符-不重复计算换行符。可变长度编码的翻译(例如在 UTF-8 和 UCS 之间)会导致类似的问题。
解决方案是关闭换行符翻译(标准称之为 "binary mode")和任何其他涉及可变长度编码的翻译,并自行处理。在关闭所有翻译的情况下,"file position" 是 OS 直接用来执行文件 I/O 的编号,因此有可能非常高效(实际上是否有效取决于标准库实现细节)。