问题标签 [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 初始化向量
我正在尝试从 ifstream fin读取并使用 istream_iterators将其放入向量vec1中。我到处都看到了这些东西:
我想保留 istream_iterators 供以后使用,所以我认为“这应该可以工作”:
...它不起作用=(我的向量完全为空。(我从中读取的文件是一个txt文件,只有数字)。
编辑: txt 如下所示:
c++ - 流迭代器的结尾是可配置的?
请考虑以下代码:
如果我输入1 23 45
并按下Enter
向量,将填充 45、23、1、数字。现在是一个简单的问题。如何更改代码,以便如果我按下Enter
并输入新数字,数字也会添加到向量中?换句话说,如何配置流迭代器的结束?
c++ - 求istreambuf_iterator澄清,阅读 Unicode 字符的完整文本文件
在 Scott Meyers 的“Effective STL”一书中,有一个很好的例子,将整个文本文件读入 std::string 对象:
请注意,它将其读取为 8 字节字符。这很好用。最近虽然我需要读取一个包含 Unicode 文本的文件(即每个字符两个字节)。但是,当我尝试(天真地)更改它以将数据从 Unicode 文本文件读取到 std::wstring 对象时,如下所示:
我得到的字符串虽然是宽字符,但仍然具有备用空值。例如,如果文件包含 Unicode 字符串“ABC”,则文件的字节(忽略 0xFF、0xFE 的 Unicode 前导字节)为:<'A'> <0> <'B'> <0> <' C'> <0>
上面的第一个代码片段将正确生成 (char) 字符串的以下内容:
sData [0] = 'A'<br> sData [1] = 0x00
sData [2] = 'B'<br> sData [3 ] = 0x00
sData [4] = 'C'<br> sData [5] = 0x00
但是,当运行第二个代码片段时,它会意外地导致 (wchar_t) 字符串的以下内容:
wsData [0] = L'A'<br> wsData [1] = 0x0000
wsData [2] = L'B '<br> wsData [3] = 0x0000
wsData [4] = L'C'<br> wsData [5] = 0x0000
就好像文件仍在被逐字节读取,然后只是简单地翻译成单独的 wchar_t 字符。
我会认为专门用于 wchar_t 的 std::istreambuf_iterator 应该导致文件一次读取两个字节,不是吗?如果不是,那它的目的是什么?
我已经追踪到模板(不容易的壮举;-),并且迭代器确实似乎仍然在逐字节读取文件并将其传递给其内部转换例程,该例程尽职尽责地声明转换是在每个字节之后完成的(不是仅在收到 2 个字节后)。
我已经在网络上搜索了许多网站(包括这个网站)来寻找这个看似微不足道的任务,但没有找到对这种行为的解释或一个很好的替代方案,它不涉及比我认为必要的更多代码(例如,A Google网络搜索也会产生相同的第二个代码片段作为可行的代码段)。
我发现唯一可行的是以下内容,我认为这是作弊,因为它需要直接访问 wstring 的内部缓冲区,然后对其进行类型强制。
哦,为了避免不可避免的“为什么以二进制模式打开文件,为什么不以文本模式打开文件”的问题,打开是故意的,好像文件是以文本模式打开的(默认),这意味着 CR/LF ("\ r\n" 或 0x0D0A) 序列将仅转换为 LF("\n" 或 0x0A)序列,而文件的纯字节读取将保留它们。无论如何,对于那些顽固分子来说,改变这一点毫无疑问是没有效果的。
所以这里有两个问题,为什么第二种情况不能像预期的那样工作(即,这些迭代器发生了什么),以及你最喜欢的将 Unicode 字符文件加载到 wstring 中的“犹太 STL 方式”是什么?
我在这里想念什么;它一定很愚蠢。
克里斯
c++ - istream_iterator 的初始化导致设置 ifstream.fail()
我正在尝试将大量数据从文件导入到 boost::dynamic_bitset。为此,我希望使用与 dynamic_bitset (uint32_t) 的块大小相匹配的 istream_iterator。
如下所示,我使用要导入的文件的位置来设置我的 ifstream。但是,一旦我使用 ifstream 初始化 istream_iterator,就会设置 ifstream 的失败位。
关于为什么会发生这种情况的任何建议?
根据 cplusplus.com:
当错误与操作本身的内部逻辑有关时,failbit 通常由输入操作设置,因此流上的其他操作可能是可能的。而当错误涉及流的完整性丢失时,通常会设置 badbit,即使在流上执行不同的操作也可能会持续存在。通过调用成员函数 bad 可以独立检查 badbit。
编辑:
散列包含 160 位散列,由单独的 C 应用程序中的 SHA1 实现生成。该文件中有几千个哈希值。我想读取 5 个 4 字节的块,而不是 20 个 1 字节的块(因此我使用 uint32_t 作为块大小)我从 C 应用程序中提取了相关代码,它显示了正在生成的哈希然后写入文件:
c++ - 通过复制实现从流中读取
我有一个代表字符序列的类,我想operator >>
为它实现一个。我的实现目前看起来像这样:
但是,以下可以预见的失败:
特别是,一旦我们到达“<code>GATTACA FOO”中的空间,复制停止(预期)并将故障位设置为istream
(也是预期的)。但是,就目前而言,读取操作实际上是成功的seq
。
我可以完全使用它来建模std::copy
吗?我也想过使用 an istreambuf_iterator
,但这实际上并不能解决这个特定问题。
更重要的是,对输入“<code>GATTACAFOO”的读取操作应该会失败,因为该输入不代表有效的 DNA 序列(这是我的类所代表的)。另一方面,int
从输入中读取 an42foo
实际上在 C++ 中成功,所以也许我应该将每个有效前缀视为有效输入?
(顺便说一句,使用显式循环这将是相当简单的,但我试图避免显式循环以支持算法。)
c++ - 如何使用 libc++ istream_iterator 读取文件中的 0xFF?
考虑以下示例代码:
以及一个包含以下内容的输入文件:“foo\xffbar”:
现在使用 clang libc++ 与 gnu libstdc++ 进行测试:
如您所见,libc++ 版本认为 0xff 是流的结尾并停止读取。所以这导致了几个问题。
1) 这是我应该报告的 libc++ 中的错误吗?我对现有错误的谷歌搜索一无所获。
2)有没有解决这个问题的好方法?
编辑
以下代码有效:
让我相信这是一个二进制转换问题,但这并不能解释为什么 libstdc++ 可以正常工作。
编辑2
使用没有二进制文件的文件也可以正常工作:
所以肯定有一些可疑的事情发生。看起来这可能是 cin 实现中的问题,而不是迭代器。
c++ - 这个迭代器声明有什么问题
我的课堂上有一个方法,这里是:
,当我尝试构建它时,我被告知不可能将“std::ifstream”转换为“std::basic_istream<_Elem,_Traits> &”?这是什么意思,我该怎么做(除了深入研究迭代器,即;-))?
c++ - std::istream_iterator,内存消耗
我尝试使用迭代器迭代文本文件:
在第一行之后,它从文件中读取一些数据(它使用运算符 >> 表示 MyData 类型)。正如预期的那样。
不幸的是,在那之后内存消耗增加了,似乎istream_iterator
试图将整个文件加载到内存中。几秒钟后(当抛出 out_of_memory 异常时)调试器进入第二行。但是文件读取失败,我无法读取更多内容。
问题:
这是istream_iterator
(将文件加载到内存中)的正确行为吗?
对于较小的文件(如 20MB),我没有观察到这一点。
也许对于这么大的文件我需要使用常见的getline
方式?
c++ - istream_iterator 之间的距离
我试图通过预先使用向量的构造函数参数来计算读取的元素数量std::cin
,std::distance
如下所示:
显然,我可以使用 一步完成此操作std::copy
,但这需要事先设置大小。我的问题不是关于向量,而是关于在std::istream_iterator
不影响流的情况下使用任意输入的大小。有任何想法吗?
c++ - C++ 使用 istream_iterator 复制和 ostream_iterator 输出
我尝试使用以下代码输入字符串,查找范围,然后复制到输出
我从 unix 命令行运行程序,并使用 (ctrl+z) 终止输入,但没有任何内容写入终端。我在 istream_iterator 上阅读了其他线程,我认为 ctrl+z 是告诉程序我已完成输入的唯一方法。但它应该在之后输出吗?(顺便说一句,我确实输入了包括“start”和“end”在内的字符串,以确保第一个和最后一个迭代器有效)。
我还从 IDE (Xcode) 运行了上述程序,但它没有显示任何输入命令行,有没有显示的?还是我必须做一些
接受输入的提示?
谢谢!