问题标签 [istream-iterator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用 istream_iterator 复制
从控制台获取字符串输入时,在这种情况下,源代码的结尾是什么?
c++ - 对`std::istreambuf_iterator`的使用感到困惑
我已经使用<<
流运算符为对象实现了反序列化例程。例程本身使用一个istreambuf_iterator<char>
从流中一个一个地提取字符,以构造对象。
最终,我的目标是能够使用 an 遍历流istream_iterator<MyObject>
并将每个对象插入到vector
. 非常标准,除了当它到达流尾时我无法istream_iterator
停止迭代。现在,它只是永远循环,即使调用istream::tellg()
表明我在文件末尾。
这是重现问题的代码:
我知道在这个简单的例子中我什至不需要 istreambuf_iterator,但我只是想简化问题,以便人们更有可能回答我的问题。
所以这里的问题是,即使istreambuf_iterator
到达流缓冲区的末尾,实际的流本身也不会进入EOF
状态。调用istream::eof()
返回 false,即使istream::tellg()
返回文件中的最后一个字节,istreambuf_iterator<char>(ifs)
并将 true与 进行比较istreambuf_iterator<char>()
,这意味着我肯定在流的末尾。
我查看了 IOstreams 库代码,以确切了解它如何确定 anistream_iterator
是否位于结束位置,并且基本上它检查是否istream::operator void*() const
评估为true
. 这个 istream 库函数只返回:
换句话说,0
如果设置了故障位,则返回 (false)。然后它将这个值与默认构造的实例中的相同值进行比较,istream_iterator
以确定我们是否在最后。
因此,当与结束迭代器比较为真时,我尝试在std::istream& operator >> (std::istream& is, Foo& f)
例程中手动设置故障位。istreambuf_iterator
这完美地工作,并正确终止了循环。但现在我真的很困惑。似乎istream_iterator
肯定会检查std::ios::failbit
以表示“流结束”条件。但这不std::ios::eofbit
就是为了什么吗?我认为failbit
是针对错误情况,例如,如果fstream
无法打开 an 的基础文件或其他情况。
那么,为什么我需要调用istream::setstate(std::ios::failbit)
来终止循环呢?
c++ - 一个文件可以定义两个“istream_iterator”吗?
我们可以让两个输入流迭代器指向一个文件吗?与上述情况一样,迭代器越来越先进(只有一次延迟,因为它应该是)并且副本中缺少第一个元素(字符串)。有没有可能的方法?
c++ - std::istream_iterator<> 与 copy_n() 和朋友
std::cin
下面的代码片段从;中读取三个整数。它写入两个numbers
并丢弃第三个:
我希望代码从 中准确读取两个整数std::cin
,但事实证明这是一个正确的、符合标准的行为。这是对标准的疏忽吗?这种行为的基本原理是什么?
从 C++03 标准中的 24.5.1/1 开始:
构造完成后,每次使用 ++ 时,迭代器都会读取并存储
T
.
所以在上面的代码中,流迭代器在调用点已经读取了一个整数。从那时起,算法中迭代器的每次读取都是预读,产生从前一次读取缓存的值。
下一个标准的最新草案n3225在这里似乎没有任何变化(24.6.1/1)。
在相关说明中,当前标准的 24.5.1.1/2 参考istream_iterator(istream_type& s)
构造函数读取
in_stream
效果:用 初始化s
。value
可以在构造期间或第一次被引用时初始化。
强调“value
可能被初始化......”而不是“应被初始化”。这听起来与 24.5.1/1 相矛盾,但也许这值得自己提出一个问题。
c++ - 用 std::istream_iterator 限制 std::copy 的范围
我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题。我istream_iterator
用来从 a 读取floats
s (或其他类型)std::istream
:
这会读取所有可能floats
的 s,直到 EOF 进入values
,它的大小固定为 4,所以现在显然我想限制范围以避免溢出并准确/最多读取 4 个值。
使用更多“正常”迭代器(即 RandomAccessIterator),只要begin+4
不超过你会做的结束:
准确读取 4 个元素。
如何做到这一点std::istream_iterator
?显而易见的想法是将调用更改std::copy
为:
但是(可以预见)这不会编译,没有候选人operator+
:
有什么建议么?是否有正确的“STLified” pre-C++0x 方法来实现这一目标?显然我可以把它写成一个 for 循环,但我想在这里学习一些关于 STL 的东西。我有一半想知道滥用std::transform
等std::merge
以某种方式实现此功能,但我不太明白如何做到这一点。
c++ - 将 boost IOStreams 与 std::ostream_iterator 一起使用
我尝试使用基于数组设备的流并希望将流传递给std::ostream_iterator
or std::istream_iterator
,但不幸的是,使用 gcc 4.3.5 时出现编译错误。
Boost::IOStreams 文档指出,取决于底层设备类别,io::stream
它要么来自std::basic_istream
或要么来自std::basic_ostream
两者 ( )。std::basic_iostream
数组设备具有可搜索的类别,因此我希望 io::stream 派生自orstd::basic_iostream
并与之兼容。但不幸的是,我得到了一个编译错误。std::ostream_iterator
std::istream_iterator
这是代码片段:
最后一行导致错误说明:
c++ - istream_iterator 问题,在循环中使用
为什么这个循环不会终止?程序在打印出 istream_iterator 中的所有元素后冻结。
更新:
所以这现在赚得更多。谢谢大家。根据提供的信息,我将事情简化为更少的行。需要重新获得模数部分,但这对我来说现在更清楚了。
更新 2:如果有人还在阅读这个帖子,我可以从社区获得关于“最终”产品的内容/风格反馈吗?
c++ - 避免用户指定策略模板参数
我正在设计一种istream_iterator
(称为my_istream_iterator
)旨在从输入流中提取单词的方法。处理从迭代器中提取的单词的方式与流中单词的分隔方式无关,但单词本身可能遵循多种格式中的一种。为了适应这一点,我希望用户能够在创建my_istream_iterator
使用输入流时指定策略类,而无需用户在迭代器的模板参数列表中指定策略类的类型。例如,如果我想以行优先顺序输出 CSV 文件中的条目,我希望能够执行以下操作:
mystream_iterator
即使迭代器在内部使用策略类,如何在创建时保留指定策略类类型的用户表单?这可能吗?
谢谢你的帮助!
如果有帮助,my_istream_iterator
类的定义可能看起来像这样:
c++ - istream_iterator 在读取字符时忽略 EOF (Ctrl+D)
我正在尝试istream_iterator
用于从cin
. 我读过按Ctrl+D发送一个EOF
结束输入流的字符。不幸的是,它出了点问题。这是我的代码:
我正在运行它并输入:as df
,然后按Ctrl+ D。它只输出asd
没有最后一个f
,然后挂起等待输入。当我键入gh
并再次按Ctrl+D时,它最后打印剩余f
的,以及g
下一个输入的,但又没有最后一个h
。当我最终按下Ctrl+D而不输入任何内容时,它会打印剩余的内容h
并退出。
我希望它能够读取asdf
并退出,因为我已经在第一个序列的末尾按下了Ctrl+ 。D
为什么得到后还在等待输入EOF
?
为什么它不打印之前读取的最后一个字符EOF
?
为什么它只在我按Ctrl+D而不输入任何内容时才退出?
这个循环需要如何改变才能以我期望的方式运行?Ctrl(即在输入中获得+序列后立即停止阅读D,无论我之前是否输入过任何内容,并阅读所有字符直到EOF
)。