从c++ istringstream读取字符(一)

c++ istringstream读取字段之operator>>

istringstream的继承关系如下:

在这里插入图片描述

operator>>操作符继承istream,为extraction operator(导出符),它被重载为以下3类成员函数:

  1. arithmetic types(算术类型)

    istream& operator>> (bool& val);
    istream& operator>> (short& val);
    istream& operator>> (unsigned short& val);
    istream& operator>> (int& val);
    istream& operator>> (unsigned int& val);
    istream& operator>> (long& val);
    istream& operator>> (unsigned long& val);
    istream& operator>> (long long& val);
    istream& operator>> (unsigned long long& val);
    istream& operator>> (float& val);
    istream& operator>> (double& val);
    istream& operator>> (long double& val);
    istream& operator>> (void*& val);
    

功能:连续地从流中导出并解析字符集,将之转换为合适的值类型(同val的类型)。

内部实现:该方法通过构造一个哨兵对象(noskipws is false,忽略空白字符)进行访问输入序列, 然后调用

num_get::get来进行导出和解析操作,相应的调整流的内部状态,最后在返回之前,销毁哨兵对象。

有几个需要关注的点:

  • noskipws 设置为false,会忽略前面连续的空白字符,直到遇到一个非空字符。

    样例:

    std::string s("  12a");
    std::istringstream iss(s);
    int val = -1;
    iss >> val; // 首先忽略连续的空白字符,找到第一个不为空白字符1,然后使用num_get::get获取能够转换为int型的字符集,并将之转换为int型
    std::cout >> val >> std::endl;
    

    输出:

    12

  • 调用num_get::get将字符集转换成相应的值,有可能发生错误,内部状态可以使用rdstate()获取。

样例:

std::string s("  2147483648a");
std::istringstream iss(s);
int val = -1;
iss >> val; // 首先忽略连续的空白字符,找到第一个不为空白字符1,然后使用num_get::get获取能够转换为int型的字符集,并将之转换为int型
if ((iss.rdstate() & std::istringstream::failbit) != 0) { // 判断是读取是否出错,有int的最大值为2147483647,所以当转换的过程中会产生错误
    std::cout << "iss >> len(int) error" << std::endl;
}
std::cout >> val >> std::endl;

输出:

iss >> len(int) error
2147483647

当不能进行转换的时候,就会将错误状态写入到 stream’s internal state flags ,通过rdstate获取

从c++ istringstream读取字符(一)_第1张图片

  1. stream buffers
istream& operator>> (streambuf* sb );

功能: 尽可能多的从流中导出字符到被stream buffer对象(sb指向的)控制的输出序列里,直到输入序列用尽或者无法插入到sb指向的stream buffer对象。

内部实现:该函数被视为执行未格式化的输入:在内部,该函数通过首先构造一个哨兵对象(将noskipws设置为true)来访问输入序列。 然后(如果良好),它将从其关联的流缓冲区对象中提取字符,就像调用其成员函数sbumpc或sgetc一样,并最终在返回之前销毁哨兵对象。
可以通过调用成员gcount来访问此函数成功读取和存储的字符数。

样例:

std::string s("Hello World");
std::istringstream iss(s); // 将字符串转换成输入流

// stream buffers
std::stringbuf stringbuf;
iss >> &stringbuf;
std::cout << stringbuf.str() << std::endl;

输出:

Hello World

  1. manipulators
istream& operator>> (istream& (*pf)(istream&));
istream& operator>> (ios& (*pf)(ios&));
istream& operator>> (ios_base& (*pf)(ios_base&));

功能:调用pf(* this),其中pf可能是一个操纵器。
操纵器是专门设计用于与该操作符一起使用的功能。
此操作对输入序列没有影响,也不会提取任何字符(除非操纵器本身这样做,例如ws)。

样例:

std::string s("5A false Hello5 World  ");
std::istringstream iss(s);
int i;
iss >> std::hex >> i;
std::cout << i << std::endl;// 5A的十进制为90
bool flag;
iss >> std::boolalpha >> flag;
std::cout << std::boolalpha << flag << std::endl;

输出:

90
false

你可能感兴趣的:(C/C++)