第八章、IO流
1.IO类型:
注意IO对象不能赋值、初始化、拷贝。
Iostream Istream ostream iostream
Fstream Ifstream ofstream sstream
Sstream Istringstream ostringstream stringstream
继承体系:
2.IO条件状态:
判断IO的具体错误状态 strm::iostate iostate是一种IO类型,表示完整的IO状态。
1)IO状态标志位:
Strm::badbit 流崩溃,表示不可恢复错误,流无法使用了。
Strm::failbit 流错误,可恢复错误,比如类型不匹配(int =char),流可以继续使用。
Strm::eofbit 文件结束
Strm::goodbit 未出错
2)IO状态函数:
s.fail() failbit 或badbit置位则返回true
s.bad() badbit状态
s.good() 流状态是否正常
s.clear() 重置流状态(比如在读到文件/字符串结尾时,若想要再次使用该流对象,需要对其failbit等状态位重置)
s.clear(state) 重置指定的状态 (state为iostate类型),比如只重置 failbit而不重置badbit cin.clear(cin.rdstate()&~cin.failbit)
s.setstate(state) 设定流状态
s.rdstate() 获得当前状态
3.输出流缓冲:
每个输出流都有一个缓冲区;
刷新缓冲的几种情况:
- 程序正常结束;
- 使用endl,flush等强制刷新
- 设置流内部状态,cout<<unitbuf;则接下来的cout输出流均为每次强制刷新,cout<<nounitbuf;则恢复正常状态;
- 关联输入输出流,这样在调用输入时即强制刷新输出流;(cin cout已经默认绑定)通过tie函数绑定,例如cin.tie(&cerr);
4.文件I/O
1)头文件:<fstream>
2)类型:ifstream ofstream fstream
3)操作:
- fstream fstrm;
- fstream fstrm(filename)
- fstream fstrm(filename,mode) 可选参数为文件名和打开模式;
- fstrm.open(filename,mode) 可选参数为mode打开模式;
- fstrm.close(); 若不调用其实语句块结束也自动析构。
- fstrm.is_open()文件是否打开;
4)文件模式:
- In:读方式打开(ifstream 默认)
- Out:写方式(ofstream 默认)
- App:附加写
- Ate:定位文件末尾
- Trunc:截断文件(ofstream 默认)
- binary:二进制IO
5.string流
1)头文件:<stringstream>
2)类型:
ostringstream
istringstream
stringstream
3)操作:
strm.str()返回保存string的拷贝(返回string流中保存的string对象)
strm.str(s)将s拷贝到strm中
Strm.clear() 流结束时候触发failbit等标志位,若想再次使用需要重置。
Strm.str("")
4)应用:
1)stringstream常常可以用来进行类型转换;
例1:
点击查看代码
int convert(string& t)
{
stringstream stream;
stream << t;
int result;
stream >> result;
return result;
}
int main()
{
string str = "12";
int num;
num = convert(str);
cout << num;
return 0;
}
2)字符串分割,C++中没有split
例2:
点击查看代码
int main(int argc, char *argv[])
{
string sen;
string word;
getline(cin, sen);
stringstream s;
s.str(sen);
while(s>>word)
{
cout << word << " ";
}
return 0;
}