C++_IO类型_文件输入输出流_字符串流

IO类型

  • iostream: 用于窗口的输入输出
  • fstream: 用于文件读写
  • sstream :读写存储在内存中的string对象

注:他们继承于istream与ostream,因此istream对象也可用于读取ifstream, string对象, ostream对象同上; 并且iostream类型可在同一个流实现输入输出操作;.
IO对象不可复制赋值

ofstream out1,out2;
out1=out2;  //不支持
ofstream print(ofstream);//在形参传递过程中涉及到复制操作
out2=print(out2);
//形参或返回类型不能为流类型,如果需要返回或传递IO对象,必须返回或传递该对象的指针或引用
//采用const修饰,那么就在读写过程中就不能改变IO对象状态了,SO,不可用const修饰

IO条件状态
条件状态包含:

  • strm:badbit :被破坏的流
  • strm::failbit: 失败的IO操作
  • strm::eofbit: 指出流已经到达文件结束符
  • clear: 将流中状态值重置为有效值
  • setstate: 添加指定条件(为strm::iostate类型)
    注:前三者都为iostate类型, IO类定义了3个iostate类型的常量值:badbit,failbit,eofbit

所有流对象都包含一个条件状态成员,由setstate,clear(添加IO条件,将某个条件状态设置为有效值)操作管理;该状态成员为iostate类型,以二进制(bit)形式使用.
流的状态由bad,fail,eof,good操作提示,流正确时bad,fail,eof返回 false,good返回true
例:流状态的查询与控制

int i;
while(cin>>i,!cin.eof()){
    if(cin.bad)
        throw runtime_error("流被破坏");
    if(cin.fail){
        cerr<<"数据错误,重试";
        cin.clear(istream::failbit);
        continue;
    }
}

当同时使用多个状态时可采用直接或运算(满足条件的二进制位都变为1)

i.setstate(ifstream::badbit|ifstream::failbit);
//同时将开启流状态成员

输入输出缓冲区管理
每个IO对象都具有一个缓冲区,用于储存程序读写数据
如下操作导致缓冲区内容被刷新

  • 程序正常结束
  • 缓冲区已经存满
  • 使用操作符显示刷新缓冲区,例:endl,flush
  • 输入操作完成,用unitbuf操作符设置流内部状态
  • 将输入输出流关联,在读取时将刷新关联的输出缓冲区

注:unitbuf用于刷新所有输出,当程序不正常结束,不会刷新缓冲区,系统不会在程序崩溃时自动刷新缓冲区
输入输出关联
IO对象具有tie函数,用法如下:

cin.tie(&cout);//cin的任何操作都会刷新关联的缓冲区
ostream *old_tie=cin.tie();
cin.tie(0);//形参为0打破二者的绑定
cin.tie(old_tie);//重新关联

文件输入流与输出流

  • ofstream: 输出文件流,创建文件并向文件写入信息
  • ifstream:输入文件流,从文件读取信息
  • fstream:同时具有ofstream与ifsteam的功能

文件操作时,C++源代码必须包含< iostream> < fstream>
打开文件
void open(const char *filename,ios::openmode mode);
第一个参数文件位置及文件名,第二个参数打开类型; open是文件流对象的成员函数
mode具有如下:

  • ios::app :在文件末尾添加内容
  • ios::ate :文件打开后定向到末尾
  • ios::in :打开文件用于读取
  • ios::out :打开文件用于输入
  • ios:trunc :打开文件清空已存在的文件流(我的理解是覆盖以前文件内容,有不对的地方还请指出)

以上介绍的标志可以结合使用,out,trunc,app只能用于指定与ofstream或fstream对象关联的文件,默认打开形式只有in,out

ofstream outfile;
outfile.open("data.txt",ios::in|ios::trunc);
//或者
fstream file; //fstream对象默认打开方式为in和out同时打开
file.open("data.txt",ios::in|ios::out);

关闭文件: 流对象.close();
写入文件: 流插入运算符(<<)
读取文件: 流提取符(>>)
实例操作:

#include<iostream>
#include<fstream> 
using namespace std;
int main(){
    char data[100];
    ofstream outfile;
    outfile.open("记录.txt",ios::app); //此处可做修改
    cin.getline(data,100);//接受一个字符串,可以接收空格,将其存储到数组中,最大存储99个字符
    outfile<<data;
    outfile.close();
    ifstream infile;
    infile.open("记录.txt");
    infile>>data;
    cout<<data<<endl; 
    infile.close();
    return 0; 
} 

字符串流

标准库定义三种类型字符串流

  • istringstream: istream派生,提供读string
  • ostringstream: ostream派生,提供写string
  • stringstream: iostream派生,提供读写
    注:必须包含sstream头文件

stringstream的特定操作

  • stringstream strm: 创建对象
  • stringstream strm(s): 用string对象s初始化strm;
  • strm.str(): 返回strm中存储的string类型对象
  • strm.str(s): 将s复制给strm,返回void

ostringstream可用于格式转换
istringstream自动将数值类型的字符转化为相应数值

int i=1,j=2;
ostringstream s1;
s1<<i<<"i"<<j<<"j";//现在str内存储的是"12"的字符串
istringstream s2(s1.str());//用s1初始化s2
string dump;
s2>>i>>dump>>j>>dump;//接收分割效果的字符串,必须保证存储操作与读取操作格式一致
cout<<i<<j;

注:上述操作中注意需要将string对象分割才能得到,空白符与换行符会被忽略

猜你喜欢

转载自blog.csdn.net/qq_40845344/article/details/81425494