- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
嗨,我希望有人能帮助理解下面代码的这种行为。
#include <iostream>
#include <algorithm>
#include <string>
#include <limits>
#include <fstream>
#include <iterator>
#include <stdexcept>
struct asound_stanza
{
unsigned index;
std::string name;
friend std::istream &operator>>(std::istream &is, asound_stanza &stan)
{
is >> stan.index;
if(!is.good())
return is;
std::getline(is, stan.name);
std::string::const_iterator
eol = stan.name.cend(),
start = std::find(stan.name.cbegin(), eol, '['),
end = std::find(start, eol, ' ');
stan.name = std::string(++start, end);
is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// std::istream_iterator<char> it;
// while(*it++!=0x0a);
return is;
}
};
int main()
{
std::ifstream is("/proc/asound/cards", std::ifstream::in);
std::istream_iterator<asound_stanza> it(is), end;
unsigned devid = 0;
std::for_each(it, end, [&](const asound_stanza &stan)->void{
if(stan.name!="CODEC")
return;
devid = stan.index;
});
std::cout << devid;
return 0;
}
这可行,但我有几个问题。在完成所有有效迭代后,它开始尝试解析另一个不可避免地失败的迭代(因此 if(!is.good())...
_)。它尝试解析它,但它从不将最终格式错误的结构传递给 lambda 表达式。为什么不呢?是不是因为流不是 good() 所以它懒得尝试传递它?
另外,我怎样才能让它不去尝试解析最终的结构,(每个节都以换行符 (0x0a) 结尾,所以我认为忽略流直到换行符会导致 EOF最终有效的迭代,但它没有。
感谢您的指导。
也可以随意传递另一个编码正确性评论。
PS:我的文件是这样的
0 [Intel ]: HDA-Intel - HDA Intel
HDA Intel at 0xfc500000 irq 46
1 [HDMI ]: HDA-Intel - HDA ATI HDMI
HDA ATI HDMI at 0xfc010000 irq 47
2 [CODEC ]: USB-Audio - USB Audio CODEC
Burr-Brown from TI USB Audio CODEC at usb-0000:00:1d.7-3.1, full speed
最佳答案
如果流处于无效状态,或者如果尝试从运算符内部的流中读取>>失败并将流设置为无效状态,则istream_iterator 将自身设置为流位置的末尾。所以迭代结束时甚至没有查看部分解析的对象。
关于c++ - istream_iterator 尝试解析无效数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7098369/
#include #include #include #include using namespace std; int main() { vector v(istream_itera
嗨,我希望有人能帮助理解下面代码的这种行为。 #include #include #include #include #include #include #include struct
我尝试实现“C++ 标准库”第 107 页中的流迭代器示例。我被困在这条线上: copy (istream_iterator(cin), istream_iterator(), back_insert
我在将 istream_iterator 用于我需要的目的时遇到困难。我有一个文件,我想将其逐行读取到一个集合中。我必须使用迭代器,我想知道我的代码或我的方法是否有问题。 非常感谢您的帮助。这是我正在
好吧,你们对我的最后一个问题很有帮助,所以我会尝试另一个问题。这也是作业,虽然上一个很旧,但已提交并等待标记。所以如果有什么东西会咬我,那可能就是这个问题。我混淆了类(class)名称等,因为仍然可以
我有两段代码。它们在 main() 中单独使用时可以正常工作。 vector v; cout start_cin(cin); istream_iterator end_of_cin; copy(st
我不明白为什么第二个参数 for_each 是一个空迭代器。有人可以向我解释一下吗? fstream("datfile.txt"); for_each(istream_iterator(datfile
给定一个包含以下十六进制代码的文件:0B 00 00 00 00 00 20 41 我正在尝试填充一个 std::vector ,然后手动检查每个字节。 这是我使用迭代器构造函数从两个 std::is
我尝试实现“C++ 标准库”第 107 页中的流迭代器示例。我被困在这条线上: copy (istream_iterator(cin), istream_iterator(), back_insert
给定一个包含以下十六进制代码的文件:0B 00 00 00 00 00 20 41 我正在尝试填充一个 std::vector ,然后手动检查每个字节。 这是我使用迭代器构造函数从两个 std::is
这是一个 Minimal, Complete, Verifiable Example我知道这不是copacetic。无论如何,给定结构: struct Foo { int even;
如果您将输入编码为 std::istream_iterator ii(std::cin); std::istream_iterator eos; std::for_each(ii,eos,record
我从标准输入得到以下输入: 2 5 2 1 5 3 4 5 2 5 1 3 4 第一行代表队列数(我们称这个值为n)。然后,对于每个队列,在第一行有一个值 l 表示队列的长度,后面是实际队列。 我正在
我正在尝试通过使用 std::distance 作为 vector 的构造函数参数来计算 std::cin 读取的元素数量,就像这样: // Gives correct amount, but now
我编写了以下程序,从 std::cin 读取 3 个数字,并将它们输出到 std::cout , 并执行两次: #include #include #include int main() {
在这种情况下,当从控制台获取字符串输入时,源代码结尾是什么? int main() { std::vector str; copy (istream_iterator(std::cin),
我在 istream_iterator 读取文件时遇到问题,因为它会忽略空行,但我需要将这些空行包含为“”。 我应该如何修改下面的程序以获得 vector 中的 5 条线? #include #in
我想读取以下输入: Foo 1 2 4 Bar 3 4 5 作为两个独立的“字符串”对象。 是否可以使用 istream_iterator 来完成此操作? 我在哪里可以找到所有这些迭代器的好文档? 最
我可以在两个 istream_iterators 之间进行赋值操作吗?如果是这样,那么行为会是什么,即两个迭代器是否会指向文件中的同一位置,即我们会得到两个指向文件中同一行的指针吗? 如果是这样,我可
我正在尝试从 ifstream fin 中读取并使用 istream_iterators 将其放入 vector vec1 中。我到处都看到了这些东西: vector vec1((istream_it
我是一名优秀的程序员,十分优秀!