定义于头文件
template< class CharT, |
类模板 basic_istream
提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。此功能以通过 basic_ios
基类访问的底层 basic_streambuf
类所提供的接口实现。大多数库实现中, basic_istream
有一个非继承数据成员:用于存储 basic_istream::gcount() 所返回的值。
std::basic_istream::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
所指向的数组的相继位置,直至出现任何下列条件(按出示顺序测试):
c
是以 Traits::eq(c, delim) 确定的分隔符。释出该分隔符(不同于 basic_istream::get() )并计入 gcount()
,但不存储它。若函数未释出字符(即 count < 1 ),则执行 setstate(failbit) 。
任何情况下,若 count>0
,则它存储空字符 CharT()
到数组的下个相继位置,并更新 gcount()
。
因为条件 #2 在条件 #3 前测试,故准确适合缓冲区的输入行不会触发 failbit 。
因为终止字符计为释出的字符,故空输入行不触发 failbit 。
s | - | 指向要存储字符到的字符串的指针 |
count | - | s 所指向的字符串的大小 |
delim | - | 释出所终止于的分隔字符。释出但不存储它。 |
*this
若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。
若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit
设置了 exceptions() ,则重抛该异常。
#include
#include
#include
#include
int main()
{
std::istringstream input("abc|def|gh");
std::vector> v;
// 注意:下列循环在从 getline() 返回的流上的
// std::ios_base::operator bool() 返回 false 时终止
for (std::array a; input.getline(&a[0], 4, '|');)
{
v.push_back(a);
}
for (auto& a : v)
{
std::cout << &a[0] << '\n';
}
}
std::basic_istream::ignore
basic_istream& ignore( std::streamsize count = 1, int_type delim = Traits::eof() ); |
从输入流释出并舍弃字符,直至并包含 delim
。
ignore
表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,它从流释出并舍弃字符,直至出现任一下列条件:
count
个字符。在 count
等于 std::numeric_limitsc
为 delim
,以 Traits::eq_int_type(Traits::to_int_type(c), delim) 确定。释出并舍弃分隔符。若 Traits::eof() 为则禁用此测试。count | - | 要释出的字符数 |
delim | - | 释出所止于的分隔字符。亦释出之。 |
*this
若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。
若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit
设置了 exceptions() ,则重抛该异常。
#include
#include
#include
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::max(), '\n');
// 跳过坏输入
}
else
{
std::cout << n << '\n';
}
}
return 0;
}