- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我实现了一个 JSON 解析器并提供了一个 operator>>
函数来解析 std::ifstream
。为了加快读取速度,我将 16 KB 复制到一个缓冲区中,然后让我的解析器从缓冲区中读取。一个小型基准测试表明,这比直接使用 std::ifstream::get
或 std::ifstream::read
更快。
当我成功读取一个 JSON 值时,我想将所有不需要的字节从缓冲区“放回”到流中,以便随后使用相同的 std 调用
在第一个调用结束的地方继续解析。我目前像这样实现这个“放回去”:operator>>
: :istream
is.clear();
is.seekg(start_position + static_cast<std::streamoff>(processed_chars));
is.clear();
因此,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));
...因为根据标准,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);
关于c++ - 如何使用缓冲区正确读取已打开的 std::ifstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44503211/
我正在开发一个小型图书馆,我需要做的一件事是让访问者访问一些数据并返回结果。 在一些较旧的 C++ 代码中,访问者需要声明一个 typedef return_type .例如,boost::stati
我正在尝试使用std:map类型的键和值制作std::any Visual Studio 2017 std::map m("lastname", "Ivanov"); std::cout (m["la
我已经在 C++ 的 map 中声明了一个集合为 std::map> .如何循环访问或打印设定值? 最佳答案 如果你知道如何迭代 std::map或 std::set单独地,您应该可以毫无问题地组合迭
如何循环? 我已经试过了: //----- code std::vector >::iterator it; for ( it = users.begin(); it != users.end();
我有两个用例。 A.我想同步访问两个线程的队列。 B.我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。 对于用例 A,我看到了使用 std::lock_
我正在查看这两种类型特征的文档,但不确定有什么区别。我不是语言律师,但据我所知,它们都适用于“memcpy-able”类型。 它们可以互换使用吗? 最佳答案 不,这些术语不能互换使用。这两个术语都表示
我有以下测试代码,其中有一个参数 fS,它是 ofstream 的容器: #include #include #include #include int
这是这个问题的延续 c++ function ptr in unorderer_map, compile time error 我试图使用 std::function 而不是函数指针,并且只有当函数是
std::unordered_map str_bool_map = { {"a", true}, {"b", false}, {"c", true} }; 我们可以在此映射上使
我有以下对象 std::vector> vectorList; 然后我添加到这个使用 std::vector vec_tmp; vec_tmp.push_back(strDRG); vec_tmp.p
为什么 std::initializer_list不支持std::get<> , std::tuple_size和 std::tuple_element ?在constexpr中用得很多现在的表达式,
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
问题 我正在尝试将 lambda 闭包传递给 std::thread,它使用任意封闭参数调用任意封闭函数。 template std::thread timed_thread(Function&& f
我想创建一个模板类,可以容纳容器和容器的任意组合。例如,std::vector或 std::map ,例如。 我尝试了很多组合,但我必须承认模板的复杂性让我不知所措。我编译的关闭是这样的: templ
我有一个 std::vector>我将其分配给相同类型的第二个 vector 。 我收到这个编译器错误: /opt/gcc-8.2.0/include/c++/8.2.0/bits/stl_algob
有时候,我们有一个工厂可以生成一个 std::unique_ptr vector ,后来我们想在类/线程/你命名的之间共享这些指针。因此,最好改用 std::shared_ptr 。当然有一种方法可以
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 6 年前。 我创建了一个 vector vector ,我想根据我定义的参
我有三个类(class)成员: public: std::vector > getObjects(); std::vector > getObjects() const; privat
我是一名优秀的程序员,十分优秀!