问题标签 [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.

0 投票
1 回答
1311 浏览

c++ - 使用 istream_iterator 复制

从控制台获取字符串输入时,在这种情况下,源代码的结尾是什么?

0 投票
5 回答
4975 浏览

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)来终止循环呢?

0 投票
2 回答
325 浏览

c++ - 一个文件可以定义两个“istream_iterator”吗?

我们可以让两个输入流迭代器指向一个文件吗?与上述情况一样,迭代器越来越先进(只有一次延迟,因为它应该是)并且副本中缺少第一个元素(字符串)。有没有可能的方法?

0 投票
7 回答
176 浏览

c++ - 为什么这段代码不断打印换行符?

0 投票
4 回答
2617 浏览

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效果:用 初始化svalue可以在构造期间或第一次被引用时初始化。

强调“value 可能被初始化......”而不是“被初始化”。这听起来与 24.5.1/1 相矛盾,但也许这值得自己提出一个问题。

0 投票
3 回答
4358 浏览

c++ - 用 std::istream_iterator 限制 std::copy 的范围

我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题。我istream_iterator用来从 a 读取floatss (或其他类型)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::transformstd::merge以某种方式实现此功能,但我不太明白如何做到这一点。

0 投票
1 回答
1093 浏览

c++ - 将 boost IOStreams 与 std::ostream_iterator 一起使用

我尝试使用基于数组设备的流并希望将流传递给std::ostream_iteratoror 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_iteratorstd::istream_iterator

这是代码片段:

最后一行导致错误说明:

0 投票
3 回答
1758 浏览

c++ - istream_iterator 问题,在循环中使用

为什么这个循环不会终止?程序在打印出 istream_iterator 中的所有元素后冻结。


更新:

所以这现在赚得更多。谢谢大家。根据提供的信息,我将事情简化为更少的行。需要重新获得模数部分,但这对我来说现在更清楚了。


更新 2:如果有人还在阅读这个帖子,我可以从社区获得关于“最终”产品的内容/风格反馈吗?

0 投票
2 回答
155 浏览

c++ - 避免用户指定策略模板参数

我正在设计一种istream_iterator(称为my_istream_iterator)旨在从输入流中提取单词的方法。处理从迭代器中提取的单词的方式与流中单词的分隔方式无关,但单词本身可能遵循多种格式中的一种。为了适应这一点,我希望用户能够在创建my_istream_iterator使用输入流时指定策略类,而无需用户在迭代器的模板参数列表中指定策略类的类型。例如,如果我想以行优先顺序输出 CSV 文件中的条目,我希望能够执行以下操作:

mystream_iterator即使迭代器在内部使用策略类,如何在创建时保留指定策略类类型的用户表单?这可能吗?

谢谢你的帮助!


如果有帮助,my_istream_iterator类的定义可能看起来像这样:

0 投票
2 回答
1960 浏览

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)。