定义于头文件
template< class CharT, |
类模板 basic_istream
提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。此功能以通过 basic_ios
基类访问的底层 basic_streambuf
类所提供的接口实现。大多数库实现中, basic_istream
有一个非继承数据成员:用于存储 basic_istream::gcount() 所返回的值。
std::basic_istream::peek
int_type peek(); |
表现为无格式输入函数 (UnformattedInputFunction) 。构造并测试 sentry 对象后,从输入流读取下个字符而不释出它。
(无)
若 good() == true ,则返回获得自 rdbuf()->sgetc() 的下个字符。
否则,返回 Traits::eof() 。
若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。
若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit
设置了 exceptions() ,则重抛该异常。
#include
#include
int main()
{
std::istringstream s1("Hello, world.");
char c1 = s1.peek();
char c2 = s1.get();
std::cout << "Peeked: " << c1 << " got: " << c2 << '\n';
}
std::basic_istream::unget
basic_istream& unget(); |
令最近释出的字符再次可用。
首先清除 eofbit 。 |
(C++11 起) |
然后函数表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,若设置了任何 ios_base::iostate 标志,则函数设置 failbit
并返回。否则,调用 rdbuf()->sungetc() 。
若 rdbuf()->sungetc() 返回 Traits::eof() ,则调用 setstate(badbit) 。
任何情况下,设置 gcount()
计数器为零。
(无)
*this
若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。
若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit
设置了 exceptions() ,则重抛该异常。
#include
#include
int main()
{
std::istringstream s1("Hello, world.");
char c1 = s1.get();
if (s1.unget())
{
char c2 = s1.get();
std::cout << "Got: " << c1 << " got again: " << c2 << '\n';
}
}
std::basic_istream::putback
basic_istream& putback( char_type ch ); |
回放字符 ch
到输入流,从使得下个释出的字符将为 ch
。
首先清除 eofbit
,然后表现为无格式输入函数 (UnformattedInputFunction) 。构造并检查 sentry 对象后,若 rdbuf()
非空,则调用 rdbuf()->sputbackc(ch) ,若 ch
不等于最近输出的字符,则它调用 rdbuf()->pbackfail(ch) 。
若 rdbuf()
为空或若 rdbuf->sputbackc(ch) 返回 Traits::eof() ,则调用 setstate(badbit) 。
任何情况下,设置 gcount()
计数器为零。
ch | - | 要放入输入流的字符 |
*this
若出现错误(错误状态标志不是 goodbit )并且设置了 exceptions() 为对该状态抛出则为 failure 。
若内部操作抛出异常,则捕获它并设置 badbit 。若对 badbit
设置了 exceptions() ,则重抛该异常。
#include
#include
int main()
{
std::stringstream s1("Hello, world"); // IO 流
s1.get();
if (s1.putback('Y')) // 修改缓冲区
{
std::cout << s1.rdbuf() << '\n';
}
else
{
std::cout << "putback failed\n";
}
std::istringstream s2("Hello, world"); // 仅输入流
s2.get();
if (s2.putback('Y')) // cannot modify input-only buffer
{
std::cout << s2.rdbuf() << '\n';
}
else
{
std::cout << "putback failed\n";
}
s2.clear();
if (s2.putback('H')) // 非修改回放
{
std::cout << s2.rdbuf() << '\n';
}
else
{
std::cout << "putback failed\n";
}
}