Nie*_*ann 4 c++ caching ifstream
我实现了一个JSON解析器并提供了一个operator>>从一个解析的函数std::ifstream.为了加快读取速度,我将16 KB复制到一个缓冲区中,让我的解析器从缓冲区中读取.一个小的基准测试显示,这比直接使用std::ifstream::get或更快std::ifstream::read.
当我成功读取JSON值时,我想将所有不需要的字节从缓冲区"放回"到流中,因此随后的调用operator>>将std::istream继续解析第一个调用结束的位置.我目前正在实施这样的"退回":
is.clear();
is.seekg(start_position + static_cast<std::streamoff>(processed_chars));
is.clear();
Run Code Online (Sandbox Code Playgroud)
因此,is输入文件流start_position是解析器读取的字符的初始值is.tellg()和processed_chars字符数.
这适用于GCC和Clang与OSX和Linux,但MSVC 2015和MSVC 2017无法将输入流带入所需状态.
显然,我在这里做错了什么.不同的编译器不应该表现得如此不同.该clear()电话已经尝试错误的结果,以与GCC/Clang的代码的运行.
什么是正确的方法(a)从已经打开std::ifstream使用缓存读取和(b)能够在最后处理的字符之后(而不是在最后一个缓存的字符之后)恢复解析?
有没有更好的方法快速阅读已经开放的std::ifstream?如上所述,删除缓存会使解析器变慢.
(对于天真的问题和可怕的实现道歉!我没有找到一个答案,处理已经打开std::ifstream或可以"放回"已经缓存的字符.)
如果以文本模式打开文件流,则无效:
is.seekg(start_position + static_cast<std::streamoff>(processed_chars));
Run Code Online (Sandbox Code Playgroud)
...因为根据标准,seekg/ tellg与处理的字符数量没有直接关系(这实际上取决于操作系统).
以下是可能的选项(无法提供您在问题中提供的更多详细信息):
putback放回你读,但没有使用的字符;tellg以获得正确的位置.这样的事情可能是:
// is is the istream
auto tg = is.tellg();
is.read(buffer, BUFFER_SIZE);
// process...
is.seekg(tg); // valid
is.ignore(processed_chars);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |