C++ IO库
- IO对象没有拷贝与赋值:由于无法拷贝IO对象,所以函数的形参和返回类型不能是IO对象,一般我们使用引用来传递和返回流
- IO库的三种头文件iostream,fstream,sstream
条件状态
* IO的错误可能发生在系统深处,所以以下的函数和标志用来访问和操作流的条件状态
strm::iostate //提供表达条件状态的完整功能
strm::badbit //用来指出流已经崩溃 发生了系统级错误
strm::failbit //用来表示一个IO操作已经失败 发生的是可恢复错误
strm::eofbit //用来指示流到了文件结束
strm::goodbit //用来指出流未处于错误状态,此值保证为0
s.eof() //若流s的eofbit位置,返回true
s.fail() //流s在failbit和bidbit位置上返回true
s.bad() //流在badbit位置上返回true
s.good() //若流处于有效状态返回true
s.clear() //将s中的所有条件状态复位,将流状态设置为有效返回void
s.clear(flags)//根据给定的flags标志位将流中对应的条件状态位 复位, falgls是strm::iostate类型,返回void
s.setstate(flags)//根据给定的flags将中对应的状态位置位
s.rdstate() //返回s当前状态,返回类型strm::iostate
分析下段代码
auto old_state = cin.rdstate();
cin.clear();
process_input(cin);
cin.setstate(old_state);
先让old_state记住当前cin状态,后将cin置为有效,最后用old_state来将cin复位。
管理输出缓冲
* endl 输出回车并刷新缓冲区,flush 仅仅刷新缓冲区,ends 输出一个空字符并刷新缓冲区
* `cout << unitbuf;`所有输出操作都会立即刷新缓冲区
* `cout << nounbuf;`回到正常缓冲方式
* cin 和 cout 是关联的,所以从输入流读取数据会导致刷新关联的输出流
* 关联函数tie()有两个版本,第一个不带参数,返回指向输出流的指针。第二个版本接受一个指向ostream的指针,将自己关联到这个ostream
文件输入输出
fstream fstrm; //创建一个未绑定的文件流。fstream是头文件fstream中定义的一个类型
fstream fstrm(s); //创建一个fstrm并打开文件s,s可以是string类型也可以是c风格的字符串指针。这些构造函数都是explicit的
fstream fstrm(s,mode);//mode依赖于fstream的类型
fstrm.open(s) //打开文件s,并且和fstrm绑定
fstrm.close() //关闭fstrm
fstrm.is_open() //指出和fstrm关联的文件是否打开成功并且尚未关闭
使用文件流对象
* 实现文件每行读入,每个单词读入的方式
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
using std::vector;
using std::string;
using std::ifstream;
using std::endl;
using std::cout;
void ReadFileToVec(const string &File, vector<string> &kk){
ifstream ifs(File);
if(ifs){ //检查open是否成功
string buf;
while(getline(ifs,buf)){ //每行读入
//while(ifs>>buf)是每个单词读入
kk.push_back(buf);
}
}
return;
}
int main()
{
vector <string> vec;
ReadFileToVec("in.txt",vec);
for(const auto &s:vec){
cout << s << endl;
}
return 0;
}
文件模式
流都有一个关联的文件模式
1. in 读方式;out 写方式;app 每次写操作均定位到文件末尾;ate 打开文件后立即定位到文件末尾,trunc 截断文件;binary 以二进制方式IO
2. 以out形式打开文件(意味着同时使用trunc模式),文件的内容会被丢弃。解决此类问题的方式是显示指定app或者in模式。
`ofstream out3("file1",ofstream::out|ofstream::app);`
string流
sstream strm; //未绑定的stringstream对象
sstream strm(s);
strm.str() //返回strm所保存的string的拷贝
strm.str(s) //将s拷贝到strm中
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
#include <sstream>
using std::vector;
using std::string;
using std::ifstream;
using std::endl;
using std::cout;
using std::istream;
using std::istringstream;
bool ReadFileToVec(const string &File, vector<string> &kk){
ifstream ifs(File);
if(ifs){ //检查open是否成功
string buf;
while(getline(ifs,buf)){
//while(ifs >> buf)
kk.push_back(buf);
}
}
else{
cout << "No data." << endl;
return false;
}
return true;
}
istream &func(istream &is){
string buf;
while(is >> buf){
cout << buf << endl;
}
is.clear();
return is;
}
int main()
{
vector <string> vec;
if(ReadFileToVec("in.txt",vec)){
/*for(const auto &s:vec){
cout << s << endl;
}*/
for(auto &s :vec){
istringstream iss(s);
string outf;
while(iss >> outf)
cout << outf << endl;
}
}
//将istringstrem一个一个单词输出
istringstream iss("h hh hhh .");
func(iss);
return 0;
}