c++ - 修剪 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();
在开始时修剪无用的线条。
但是,我找不到不通过字符串来修剪流/文件末尾的方法。我应该如何进行?
解决方案
std::getline
采用可选的分隔符;你可以通过}
。当然,这将为}
您的 JSON 中的每个提供一个“行”;您必须自己附加这些部分。
最后一个std::getline(... , '}')
将因 EOF 而失败,或者failbit
如果垃圾多于单个字符串中可以存储的垃圾,则可能会失败。也许你也可以抓住std::bad_alloc
。
这是一个单遍算法,因此不可避免地要缓冲尾随垃圾。在两遍算法中,您可以找到开头{
和结尾}
,调用myIfstream.clear()
重置 EOF 状态,查找到第一个{
然后逐字符读取,直到到达结尾的位置}
。
推荐阅读
- c++ - 如何包含 a.dll 描述/公司信息?
- regex - 正则表达式:匹配文本、数字、+、_ 和 - 的所有实例,在冒号之间,它们不是 URL 的一部分
- python - 检查excel表格中的缺失值
- node.js - NodeJS:如何在使用 pkg 编译时修复“找不到模块'node-windows'
- git - 如何使用 LFS 从 bitbucket 存储库中删除内容
- ruby - 如何为哈希中的日期设置默认格式?
- python-3.x - 将行与一列中的所有其他先前字符串进行比较,并在 Python 中更改另一列的值
- node.js - Node.js + 反应;聊天应用程序(初学者)
- git - Git不允许我输入我的克隆密码,因为我第一次弄错了
- c++ - 如何将数据类型声明从 .cpp 文件传输到 .cu 文件?