c++11 标准模板(STL)(std::basic_istream)(七)

定义于头文件 <istream>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_istream : virtual public std::basic_ios<CharT, Traits>

类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。此功能以通过 basic_ios 基类访问的底层 basic_streambuf 类所提供的接口实现。大多数库实现中, basic_istream 有一个非继承数据成员:用于存储 basic_istream::gcount() 所返回的值。

无格式输入

一直读并取走字符,直至找到给定字符

std::basic_istream<CharT,Traits>::getline

basic_istream& getline( char_type* s, std::streamsize count );

(1)

basic_istream& getline( char_type* s, std::streamsize count, char_type delim );

(2)

从流释出字符,直至行尾或指定的分隔符 delim

第一版本等价于 getline(s, count, widen('\n')) 。

表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,从 *this 释出字符并存储它们于首元素为 s 所指向的数组的相继位置,直至出现任何下列条件(按出示顺序测试):

  • 输入序列中出现文件尾条件(该情况下执行 setstate(eofbit) )
  • 下个可用字符 c 是以 Traits::eq(c, delim) 确定的分隔符。释出该分隔符(不同于 basic_istream::get() )并计入 gcount() ,但不存储它。
  • 已经释出 count-1 个字符(该情况下执行 setstate(failbit) )。

若函数未释出字符(即 count < 1 ),则执行 setstate(failbit) 。

任何情况下,若 count>0 ,则它存储空字符 CharT() 到数组的下个相继位置,并更新 gcount()

注意

因为条件 #2 在条件 #3 前测试,故准确适合缓冲区的输入行不会触发 failbit 。

因为终止字符计为释出的字符,故空输入行不触发 failbit 。

参数

s-指向要存储字符到的字符串的指针
count-s 所指向的字符串的大小
delim-释出所终止于的分隔字符。释出但不存储它。

返回值

*this

异常

若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。

若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit 设置了 exceptions() ,则重抛该异常。

 调用示例

#include <iostream>
#include <sstream>
#include <vector>
#include <array>

int main()
{
    std::istringstream input("abc|def|gh");
    std::vector<std::array<char, 4>> v;

    // 注意:下列循环在从  getline() 返回的流上的
    // std::ios_base::operator bool() 返回 false 时终止
    for (std::array<char, 4> a; input.getline(&a[0], 4, '|');)
    {
        v.push_back(a);
    }

    for (auto& a : v)
    {
        std::cout << &a[0] << '\n';
    }
}
输出

读且取走并舍弃字符,直至发现给定字符

std::basic_istream<CharT,Traits>::ignore

basic_istream& ignore( std::streamsize count = 1, int_type delim = Traits::eof() );

从输入流释出并舍弃字符,直至并包含 delim

ignore 表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,它从流释出并舍弃字符,直至出现任一下列条件:

  • 已释出 count 个字符。在 count 等于 std::numeric_limits<std::streamsize>::max() 的特殊情况下禁用此测试。
  • 输入序列中出现文件尾条件,该情况下函数调用 setstate(eofbit) 。
  • 输入序列中下个可用字符 cdelim ,以 Traits::eq_int_type(Traits::to_int_type(c), delim) 确定。释出并舍弃分隔符。若 Traits::eof() 为则禁用此测试。

参数

count-要释出的字符数
delim-释出所止于的分隔字符。亦释出之。

返回值

*this

异常

若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。

若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit 设置了 exceptions() ,则重抛该异常。

 调用示例

#include <iostream>
#include <sstream>
#include <limits>

int main()
{
    std::istringstream input("1\n"
                             "some non-numeric input\n"
                             "2\n");
    for (;;)
    {
        int n;
        input >> n;

        if (input.eof() || input.bad())
        {
            break;
        }
        else if (input.fail())
        {
            input.clear(); // 反设置 failbit
            input.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
            // 跳过坏输入
        }
        else
        {
            std::cout << n << '\n';
        }
    }
    return 0;
}
输出

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值