ifstream_iterator和如果流
ifstream_iterator and ifstream
任务是从文件到向量读取数字。格式为:每行一个数字。我想用STL风格制作。所以,我写了这样的代码:
::std::deque<size_t> Input(const ::std::string& filename) {
::std::deque<size_t> result;
try {
::std::ifstream file(filename.c_str(), ::std::ios::binary);
file.exceptions(::std::ifstream::failbit |
::std::ifstream::badbit);
::std::copy(::std::istreambuf_iterator<size_t>(file),
::std::istreambuf_iterator<size_t>(),
::std::back_inserter(result));
} catch ( ::std::exception& e ) {
::std::cout << e.what() << ::std::endl;
}
return result;
}
它工作正常,我得到了我想要的(文件中的所有数字(,但也在文件末尾收到一个带有 failbit 的异常。怎么了?我不想使用 getline(( 并手动解析 - 想让 STL 为我做。更新:我检查了 - 文件末尾没有新行。
TL;DR:如果在尝试读取新值时流的内容用完,则设置failbit
。
标准中定义,使用 istream_iterator
与执行以下操作具有相同的效果:
*in_stream >> value; /* istream_iterator::operator++ */
return value; /* istream_iterator::operator* */
在处理整数(例如size_t
(的情况下,这将导致对以下内容的调用(可以在27.6.1.2.2/2 - lib.istream.formatted.arithmetic下阅读(。
use_facet<numget> (loc).get (*this, 0, *this, err, lval)
...
setstate (err);
err
通过引用传递,并将设置为函数可能遇到的任何错误。以下是use_facet<numget> (loc).get
标准定义的片段:
22.2.2.1.2/8
-
[lib.facet.num.get.virtuals]迭代器
in
总是指向最后一个位置之外的一个位置 字符已成功匹配。如果设置了val
,则err
设置为str.goodbit;
或str.eofbit
如果,在寻找另一个角色 匹配,发现(in == end)
.如果未设置
val
,则err
设置为str.failbit
;或(str.failbit|str.eofbit)
是否 失败的是(in == end)
.
TL;DR:如果在尝试读取新值时流的内容用完,则设置failbit
。
相关文章:
- 如果没有malloc,链表实现将失败
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- C++擦除(如果存在)
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 在'如果'陈述输出如何正确
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 如果基类包含双指针成员,则派生类的构造函数
- 如果没有数学库,我如何在C++中创建复利公式
- 如果我已经有一个头,那么模板(-t)文件属于哪里
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?