标准库的IO类型主要有:iostream(定义了用于读写流的基本类型),fstream(定义了读写命名文件的类型),sstream(定义了读写内存string对象的类型),并且为了支持宽字符的语言,标准库还定义了一组类型和对象来操纵wchar_t类型的数据。
注意:
①IO对象无拷贝或者赋值
②进行IO操作的函数常常以引用方式传递和返回流
第一部分:条件状态
strm::iostat:(strm是一种IO类型)是一种机器相关的类型提供了条件状态的完整性
strm::badbit:用来指出流已经崩溃
strm::failbit用来指出一个IO操作失败了
strm::eofbit用来指出流到达了文件结束
strm::goodbit用来指出流未出错
s.eof():若流eofbit置位,则返回true,s.fail(),s.good(),s.bad()同理
s.clear():将流的所有状态位复位
s.clear(flags):根据给定的标志为将流s中对应条件状态位复位flag位iostate,同s.setstate(flags)
s.rdstate():返回流s的当前状态
第二部分:管理输出缓冲
1、刷新输出缓冲区
每一个输出流都管理着一个缓冲区,用来保存程序读写的数据。
刷新缓冲区主要有四种方式:
①endl:完成换行并刷新缓冲区
②flush:刷新缓冲区但不添加任何额外字符
③ends:向缓冲区插入一个空白字符,然后刷新缓冲区
④unitbuf:告诉流在接下来的每次操作之后都有一次flush操作(nounitbuf)
注意:
①IO对象无拷贝或者赋值
②进行IO操作的函数常常以引用方式传递和返回流
③读写IO对象会改变其自身的状态,传递和返回的引用不能用const
第一部分:条件状态
strm::iostat:(strm是一种IO类型)是一种机器相关的类型提供了条件状态的完整性
strm::badbit:用来指出流已经崩溃
strm::failbit用来指出一个IO操作失败了
strm::eofbit用来指出流到达了文件结束
strm::goodbit用来指出流未出错
s.eof():若流eofbit置位,则返回true,s.fail(),s.good(),s.bad()同理
s.clear():将流的所有状态位复位
s.clear(flags):根据给定的标志为将流s中对应条件状态位复位flag位iostate,同s.setstate(flags)
s.rdstate():返回流s的当前状态
第二部分:管理输出缓冲
1、刷新输出缓冲区
每一个输出流都管理着一个缓冲区,用来保存程序读写的数据。
刷新缓冲区主要有四种方式:
①endl:完成换行并刷新缓冲区
②flush:刷新缓冲区但不添加任何额外字符
③ends:向缓冲区插入一个空白字符,然后刷新缓冲区
④unitbuf:告诉流在接下来的每次操作之后都有一次flush操作(nounitbuf)
// 以引用方式传递和返回流
//读写IO对象会改变其自身的状态,传递和返回的引用不能用const
ostream& operator<<(ostream& out, const Test& src)
{
for (size_t i = 0;i < strlen(src._ptr);++i)
{
out<
<
2、关联输入输出流
标准库cin和cout关键在一起,任何试图从输入流读数据的操作都会先刷新输出流。
关联函数:s.tie()和s.tie(&flags)
第二部分:文件输入输出
文件操作特有的操作主要有:fstrm.open(s)、fstrm.close()、fstrm.is_open();并且fstream对象会自动构造和析构。
使用代码如下:
ifstream in(file1);
ofstream out(file2);//隐含的设置为输出和截断
if (out)
{
cerr<< "could not open"<<endl;
}
第三部分:string流
istringstream从string中读取数据,ostringstream向string写入数据,而头文件stringstream既可以从string读数据也可以向string中写数据。
使用istringstream:
string line;
string word;
//保存来自输入的所有数据
vector
people;
//逐行从输入读取数据,直到cin遇到文件尾
while (getline(cin, line))
{
//创建一个此记录数据的对象
Person info;
//将此记录绑定到刚读入的行
istringstream record(line);
record >> info.name;
while (record >> word)
{
info.phones.push_back(word);
}
//将此记录追加到people的末尾
people.push_back(info);
}
使用ostringstream:
ostringstream oss(ios_base::ate);
oss.str("abc");
oss << "def";
cout << oss.str() << endl;