首页 > 解决方案 > 修剪 istream 的结尾

问题描述

假设我有一个看起来像的文件

garbage (with no '{' nor '}')
garbage
{"json": "a very big json that may or may not span multiple lines"}
garbage
garbage

我想提供给将流作为输入的 JSON 反序列化器。内存问题意味着我不能将整个文件变成一个字符串来操作它。

我知道我应该能够做类似的事情

myIfstream.ignore(std::numeric_limits<std::streamsize>::max(), '{');
myIfstream.unget();

在开始时修剪无用的线条。

但是,我找不到不通过字符串来修剪流/文件末尾的方法。我应该如何进行?

标签: c++stream

解决方案


std::getline采用可选的分隔符;你可以通过}。当然,这将为}您的 JSON 中的每个提供一个“行”;您必须自己附加这些部分。

最后一个std::getline(... , '}')将因 EOF 而失败,或者failbit如果垃圾多于单个字符串中可以存储的垃圾,则可能会失败。也许你也可以抓住std::bad_alloc

这是一个单遍算法,因此不可避免地要缓冲尾随垃圾。在两遍算法中,您可以找到开头{和结尾},调用myIfstream.clear()重置 EOF 状态,查找到第一个{然后逐字符读取,直到到达结尾的位置}


推荐阅读