第8章 IO库
8.1 IO类
宽字符版本的类型和函数的名字以一个w开始
目前为止,我们使用过的IO类型和对象都是操纵char数据的
不能拷贝或对IO对象赋值
不能将形参或返回类型设置为流类型
ofstream out1, out2;
out1 = out2; //错误
ofstream print(ofstream); //错误
out2 = print(out2); //错误
条件状态
一个流一旦发生错误,其上后续的IO操作都会失败。只有当一个流处于无错状态时,我们才可以从它读取数据,向它写入数据。
确定一个流对象的状态最简单的方法是将它当做一个条件来使用:
while(cin >> word){
//...
}
如果badbit、failbit和eofbit任何一个被置位,则检测流状态的条件会失败。
练习8.1:
istream& func(istream& is)
{
string mm;
while (is >> mm)
cout << mm << endl;
is.clear();//对流进行置位的函数
return is;
}
int main() {
istream& is = cin;
istream& cin = func(is);
system("pause");
return 0;
}
管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据。
导致缓冲刷新的原因有很多:
- 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
- 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区
- endl来显示刷新缓冲区
- 在每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
- 一个输出流可能被关联到另一个流。例如,cin和cerr都关联到cout,因此,读cin和写cerr都会导致cout的缓冲区被刷新
endl完成换行并刷新缓冲区
flush刷新缓冲区,但不输出任何额外的字符
ends向缓冲区插入一个空字符
8.2 文件输入输出
更多IO文件操作也可以看博客第五章:https://blog.csdn.net/qq_39236499/article/details/115346546
头文件fstream定义了三个类型来支持文件IO
- ifstream:从一个给定位文件读取数据
- ofstream:向一个给定文件写入数据
- fstream:读写给定文件
例:将文件中的数据写入vector容器
按行写
string infile = "1.txt"; //文件名
vector<string> v;
ifstream in(infile);
if(in){
string buf;
while(getline(in, buf)){
v.push_back(buf);
}
}
else{
cerr << "cannot open this file: " << infile << endl;
}
按单词写
string infile = "1.txt"; //文件名
vector<string> v;
ifstream in(infile);
if(in){
string buf;
while(in >> buf){
v.push_back(buf);
}
}
else{
cerr << "cannot open this file: " << infile << endl;
}
文件模式
易懂版:
8.3 string流
sstream头文件定义了三个类型来支持内存IO
- istringstream:从string读取数据
- ostringstream:向string写入数据
- stringstream:既可以读又可以写
当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用istringstream。
当我们逐步构造是输出,希望最后一起打印时,ostringstream是很有用的
小结
-
iostream处理控制台IO
-
fstream处理命名文件IO
-
stringstream完成内存string的IO
-
类fstream和stringstream都是继承类iostream
-
输入类都是继承自istream
-
输出类都是继承自ostream