C++IO库

IO库

IO类

  • iostream头文件

    • istreamwistream从流读取数据
    • ostreamwostream向流写入数据
    • iostreamwiostream读写流
  • fstream头文件

    • ifstreamwistream从文件读取数据
    • ofstreamwofstream向文件写入数据
    • fstreamwfstream读写文件
  • sstream头文件

    • istringstreamwistringstream从string读取数据
    • ostringstreamwostringstream向string写入数据
    • stringstreamwstringstream读写string
  • 宽字符版本的类型和函数的名字以w开头

IO对象无拷贝或赋值

  • 不能将形参或返回类型设置为流类型,采用引用方式传递和返回流。
  • 读写一个IO对象会改变其状态,传递和返回的引用不能为const
ofstream out1,out2;
//out1=out2;不能戳流对象赋值
//ofstream print(ofstream);不能初始化ofstream参数
//out2=print(out2);不能拷贝流对象

管理输出缓冲

  • 每个输出流都管理一个缓冲区,用来保存程序读写的数据
  • 缓冲刷新的原因(程序真正写到输出设备或文件中)
    • 程序正常结束
    • 缓冲器满了
    • 使用操纵符endl显式刷新缓冲区
    • 在每个输出操作之后,可以用操纵符unitbuf设置流的内部状态清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
    • 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如默认情况下,cin和cerr都关联到cout,因此读cin或写cerr都会导致cout的缓冲区被刷新
刷新输出缓冲区
  • endl
  • flush刷新缓冲区但不输出任何额外的字符
  • ends向缓冲区插入一个空字符然后刷新缓冲区
cout<<"hi!"<<endl;//输出hi和一个换行,然后刷新缓冲区
cout<<"hi!"<<flush;//输出hi然后刷新缓冲区,不附加任何额外字符
cout<<"hi!"<<ends;//输出hi和一个空字符,然后刷新缓冲区
unitbuf操纵符
  • 在每次输出操作后都刷新缓冲区,高数流在接下来的每次写操作后都进行一次flush操作
  • nounitbuf操纵符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制
cout<<unitbuf;//所有输出操作后都会立即刷新缓冲区
cout<<nounitbuf;//回到正常的缓冲方式
  • 如果程序崩溃,暑促缓冲区不会被刷新
关联输入和输出流
  • 当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流
//标准库将cout和cin关联在一起
cin>>ival;
//导致cout的缓冲区被刷新

文件输入输出

  • fstream特有的操作
    • fstream fstrm创建一个未绑定的文件流
    • **fstream fstrm(s)**创建一个fstream,打开名为s的文件,s可以是string类型或是一个指向C风格字符串的指针。这些构造函数都是explicit的。默认的文件模式mode依赖于fstream的类型
    • **fstream fstrm(s,mode);**与前一个构造函数类似,但按指定mode打开文件
    • **fstrm.open(s)**打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向C风格字符串的指针。默认的文件mode依赖于fstream的类型。返回void
    • **fstrm.close()**关闭与fstrm绑定的文件,返回void
    • **fstrm.is_open()**返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

使用文件流对象

  • 创建文件流对象时,若提供了文件名,则open会自动调用
ifstream in(ifile);//构造一个ifstream并打开给定文件
ofstream out;//输出文件流未关联到任何文件
成员函数open和close
ifstream in(ifile);//构造一个ifstream并打开给定文件
ofstream out;//输出文件流未关联到任何文件
out.open(ifile+".copy");//打开指定文件
  • 如果调用open失败。failbit会被置位。

文件模式

  • in以读方式打开

  • out以写方式打开

  • app每次写操作前均定位到文件末尾

  • ate打开文件后立即定位到文件末尾

  • trunc截断文件

  • binary以二进制方式进行IO

  • 只可以对oftream或fstream对象设定out模式

  • 只可以对ifstream或fstream对象设定in模式

  • 只有当out也被设定时才可设定trunc模式

  • 只要trunc没被设定,就可以设定app模式。在app模式下,即使没有显式指定out模式,文件也总是以输出方式被打开

  • 默认情况下,即使没有指定trunc,以out模式打开的文件也会被截断。为了保留以out模式打开的文件的内容,必须指定app模式,这样只会将数据追加写到文件末尾;或者同时指定in模式,即打开文件同时读写操作

  • ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用

以out模式打开文件会丢失已有数据
  • 需同时指定app模式
//filel都被截断
ofstream out("filel");//隐含以输出模式打开文件并截断文件
ofstream out2("filel",ofstream::out);//隐含地截断文件
ofstream out3("filel",ofstream::out|ofstream::trunc);
//为了保留文件内容,必须显式指定app模式
ofstream app("file2",ofstream::app);//隐含为输出模式
ofstream app2("file2",ofstream::out|ofstream::app);
每次调用open时都会确定文件模式
ofstream out;//未指定文件打开模式
out.open("scratchpad");//模式隐含设置为输出和截断
out.close();//关闭out以便将其用于其他文件
out.open("precious",ofstream::app);//模式为输出和追加
out.close();
//第一个open调用未显式指定输出模式,文件隐式地以out模式打开。通常情况下,out模式意味着同时使用trunc模式。

string流

  • sstream strmstrm是一个未绑定的stringstream对象。sstream是头文件sstream中定义的一个类型
  • **sstream strm(s)**strm是一个sstream对象,保存string s的一个拷贝。此构造函数是explicit的
  • **strm.str()**返回strm所保存的string的拷贝
  • **strm.str(s)**将string s拷贝到strm中,返回void
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值