- IO库类型和头文件【重点】
- 头文件< iostream>读写流
类型istream/ostream/iostream(还有宽字符版本wistream,下同) - 头文件< fstream>读写文件
类型ifstream/ofstream/fstream - 头文件< sstream>读写string
类型istringstream/ostringstream/stringstream
- 管理输出缓冲【重点】
导致缓冲刷新(即数据真正写到输出设备或文件)的原因有很多:
- 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
- 缓冲区满,
- 使用操纵符显式刷新(如endl,flush,ends)
cout << “hi” << endl;//输出hi和一个换行,然后刷新缓冲区
cout << “hi” << flush;//输出hi,然后刷新缓冲区,不附加任何额外字符
cout << “hi” << ends;//输出hi和一个空字符,然后刷新缓冲区 - 在每个输出操作之后,我们可以用操纵符unitbuf来设置流的内部状态(PS:cerr被默认设置为unitbuf)
cout << unitbuf;//所有输出操作后都会立即刷新缓冲区
//任何操作都立即舒心,无缓冲
cout << nounitbuf;//回到正常的缓冲方式 - 一个输出流可能被关联到另一个流,当读写被关联流时,关联到的流的缓冲区将被刷新。(PS:默认cin cerr都关联到cout,因此读cin写cerr都会导致cout缓冲区刷新)每个流最多关联到一个流,但多个流可以同时关联到同一个ostream
- 文件输入输出
- fstream特有的操作
- fstream fstrm;//创建一个未绑定的文件流
- fstream fstrm(s);//创建一个fstream,并打开名为s的文件
- fstream fstrm(s, mode);//同上,只不过是以mode模式打开
- fstrm.open(s);//打开名为s的文件,并将其与fstrm绑定。返回void
- fstrm.close();//关闭与fstrm绑定的文件。返回void(PS:当一个fstream对象被销毁时,close会自动被调用)
- fstrm.is_open;//返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
- 文件模式
- in 以读方式打开//与ifstream关联的文件默认以in打开
- out 以写方式打开//与ofstream关联的文件默认以out打开
- app 每次写操作前均定位到文件末尾
- ate 打开文件后立即定位到文件末尾
- trunc 截断文件
- binary 以二进制方式进行IO
PS1:以out模式打开的文件会丢弃已有数据
PS2:以多种模式打开文件:ofstream app(“file”, ofstream::out | ofstream::app)
- string流
- stringstream特有的操作
- sstream strm;//strm是为绑定的stringstream对象
- sstream strm(s);//strm保存string s的一个拷贝
- strm.str() 返回strm所保持的string拷贝
- strm.str(s) 将string s拷贝到strm中。返回void
- istringstream常用于——带空格的一行字符串
例:
string line, word;
vector< string> str;
while( getline(cin,line) ) {
istringstream strm(line);
while( strm >> word )
str.push_back(word);
} - ostringstream常用于——逐步构造输出,最后一起打印
ostringstream ostrm;
for(const auto &str: vec) {
ostrm << str <<” “;
}
cout << ostrm.str() << endl;
2、3合在一起,即为:多行输入转换为一行输出
#include<iostream>
#include<vector>
#include<sstream>
#include<string>
using namespace std;
int main()
{
string line, word;
vector< string> vec;
while( getline(cin,line) ) {
istringstream strm(line);
while( strm >> word )
vec.push_back(word);
}
ostringstream ostrm;
for(const auto &str: vec) {
ostrm << str <<" ";
}
cout << ostrm.str() << endl;
}