作为一个写了挺久代码的人,到现在也只会用cout,cin实在是感到惭愧,况且找工作考算法也会用到很多输入输出,所以就干脆把c++的IO操作整理一下。
基础输入输出:
iostream库:包含两个基础类型istream和ostream,分别表示输出流和输入流,这里的一个流就是一个字符序列,从IO设备读出或写入的,注意这个流意思是随着时间推移。字符串会顺序生成或消耗。
两个基本的标准输入输出:cin -istream类型,cout -ostream类型
in/out是相对于你的程序来说的
使用例子:
cout :第一行<<运算符接收两个运算对象,左侧必须是ostream,右侧是要打印的值,并返回左侧对象本身,达到链式编程的目的,第一行等价于:
endl是一个操纵符,结束当前行,并将设备关联的缓冲区内容刷入设备中。
cin: 输入运算符同输出,接收左侧istream对象,一个右侧对象。从给定的istream读入数据,存入给定对象,返回左侧对象。
以上输入输出都会以空格或者换行为分割读取,也就是我们不会读取到空格,但有时我们希望能保留空格,这时应该用到getline替代>>运算符。注意getline也会读取输入中的换行符,但是不会读到字符串里。并且getline在读到文件末尾会返回空字符串,可以作为判断是否继续读文件的循环判断。
getline示例:
IO类
注意:IO类对象不能进行拷贝或者赋值
io条件状态:一般用的比较多的就是s.sof()读到末尾了就返回true;
以上的状态为会在某些条件时置位,一个流一旦发生错误,其后续IO操作都会失败。只有当一个六处于无错状态才可读取写入数据,在使用一个流之前应该检查状态,确定流对象状态最简单的方法就是将它当作一个条件使用:
管理条件状态:
流对象的rdstate成员函数会返回一个iostate值,会反映当前流状态,setstate会将给定条件位置位。
clear成员有两个版本,一个带参数拎一个不带,接受的参数时iostate;不带参数的复位所有错误标志位,或者这样用:(使用场景我还没遇到过,就写写么多吧)
输出缓冲区管理:
每个输出流都管理一个缓冲区,用来保存程序读写的数据,文本串可能立即打印或者被保存在缓冲区中,这可以帮助我们减少io操作次数,一次打印多次写入的内容。
导致缓冲刷新的原因:
程序正常结束,作为main函数return操作的一部分被执行
缓冲区满
endl等显式刷新
每个输出操作的unitbuf操纵符
被关联的流读写
刷新输出缓冲区方式: endl 换行并刷新, flush刷新, ends;
unitbuf操纵符:
文件输入输出
头文件ftream定义了三个类型:ifstream,、ofstream、fstream
这些类型都以用cin,cout,getline来读写文件;
除了继承自iostream类型的行为之外fstream还新增了一些方法,可以对fstream, ifstream, ofstream调用。但不能对其他IO类型调用。
文件流对象使用:
读写一个文件时,可以定义一个文件流对象,并将对象与之关联,open成员函数打开文件,若给出文件名则自动调用;
fstream对象可以作为参数传递给iostream&对象
成员函数open和close:
string流
sstream头文件定义了三个类型支持,istringstream, ostringstream,stringstream
istringstream使用范例:
文件:
ostringstream
扩展:在使用cin读取文件后,你的换行符会留在输入流中,如果使用getline,get这种行操作,会失效,具体看下面链接;
(28条消息) C++输入时对换行的处理_c++换行输入___乔木的博客-CSDN博客
1、getline读取换行符 并且将换行符替换成'\0',并且会丢弃换行符
2、cin会把换行符留在输入队列中
3、cin.getline读取换行符并替换成'\0',并且不会主动丢弃换行符,会把它留在输入队列中