ifstream_iterator和如果流

ifstream_iterator and ifstream

本文关键字:如果 iterator ifstream      更新时间:2023-10-16

任务是从文件到向量读取数字。格式为:每行一个数字。我想用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

相关文章: