目录
  • 1.标准输出输入流-控制台流(iostream类) 
  • 2. 文件流(I/O操作)
    • 文本文件
      • 使用<< >> 进行读写
      • getline()读取一行
      • get() put()进行单个字符读写
    • 二进制文件读写
      • get() put()进行单个字节读写
      • read() write()多个字节读写
    • 注意事项
    • 3.字符串输入输出流(sstream)
      • sprintf sscanf 和 stringstream的使用
        • 补充内容:C/C++中int和字符串类型的转换
          • string转int
          • int转string
          • 多功能转换
          • stringstream

      C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能

      C++ 系统实现了一个庞大的类库,其中 ios 为基类,其他类都是直接或间接派生自 ios 类

      C++超详细梳理IO流操作

      1.标准输出输入流-控制台流(iostream类) 

      cin实际上是一个标准输入流对象(类对象),常用的方式有,cin>>(cin.operator>>()), cin.get(), cin.getline()(用法:cin.getline(char s[], int nLength))

      或者在std命名空间下,有一个单独的getline()函数,但是该函数时使用string对象作为参数的,即:getline(cin, str)

      cout是标准输出流对象(类对象),cout<<

      cout cin printf scanf(格式化输入输出)比较

      总结:c++中尽量用cin和cout

      //c_str()就是把string类对象转换成和c兼容的char*类型。
      //这是为了与c语言兼容,在c语言中没有string类型
      //故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式
      //例如
      	string a = "hellofjifj";
      	printf("%s\n", a.c_str());
      	//printf("%s\n", a);//这样会有问题

      2. 文件流(I/O操作)

      在文件流中提供了三个派生类对文件数据进行操作(注意这里是类,不像控制台提供的是类对象)

      • ofstream:输出,即写文件,由ostream引申而来
      • ifstream:输入,即读取文件,由istream引申而来
      • fstream :输入输出,同时读写操作,由iostream引申而来

      文件的类型:文本文件 和 二进制文件

      文件读写的步骤:

      • 包含的头文件:#include <fstream>
      • 创建流
      • 打开文件(文件和流关联)
      • 读写 (写操作:<<,put( ),write( )读操作:>> , get( ),getline( ), read( ))
      • 关闭文件:把缓冲区数据完整地写入文件, 添加文件结束标志, 切断流对象和外部文件的连接

      文本文件

      使用<< >> 进行读写

      << 能实现以行为单位写入文件

      >> 不能一行为单位读入内存,而是以单词为单位。总是以空格、Tab、回车结束

          ofstream OpenFile("file.txt");  
        if (OpenFile.fail())  
        {  
          cout<<"打开文件错误!"<<endl;  
          exit(0);  
        }  
          OpenFile << "abc def ghi";//把内容写入file文件  
        OpenFile.close();    
          const int len=20;  
          char str[len];  
          ifstream OpenFile("file.txt");  
        if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile >> str;  
          cout << str << endl;  
          OpenFile.close(); //str的内容为abc,而不是abc def ghi(见空格停止)

      getline()读取一行

      getline():以行为单位读入内存,能一次读入一行

      函数原型:istream &getline( char *buffer, streamsize num );

      getline( )函数用于从文件读取num个字符到buffer(内存)中,直到下列情况发生时,读取结束:

      • num个字符已经读入
      • 碰到一个换行标志
      • 碰到一个EOF
          const int len=20;  
          char str[len];  
          ifstream OpenFile("file.txt");  
          if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile.getline(str,20);  
          cout << str << endl;  
          OpenFile.close();//运行结果:str的内容为abc def ghi (一直把一行读完)

      get() put()进行单个字符读写

      ostream& put (char c);

      函数功能:使用 put( )函数,向文件中写入字符

          char ch='1';  
          ofstream OpenFile("file.txt");  
        if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile.put(ch); // 把字符1写入文件
          OpenFile.close();  

      istream& get (char& c);

      函数功能:使用 get( )函数,从文件中读取字符

          char ch;  
          ifstream OpenFile("file.txt");  
        if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile.get(ch);  
          cout << ch; //把字符1从文件中读到ch(内存)中
          OpenFile.close();  

      二进制文件读写

      get() put()进行单个字节读写

      ofstream &put(char ch)

      在内存中写入一个字节到文件

          char ch='a';  
          ofstream OpenFile("file.txt",ios::binary);  
          //以二进制的方式处理,在打开时要用 ios::binary 显式声明
        if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile.put(ch);  
          OpenFile.close();  

      ifstream &get(char ch)

      在文件中读取一个字节到内存

          char ch;  
          ifstream OpenFile("file.txt",ios::binary);  
        if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile.get(ch); // 从文件中读取一个字符
          cout << ch;  
          OpenFile.close(); 

      read() write()多个字节读写

      ostream & ostream :: write ( char * buf , int n ) ;

      功能:把buf指向的内容取n个字节写入文件

      参数说明:buf表示要写入内存的地址,传参时要取地址。n表示要读入字节的长度

      注意:

      • 该函数遇到空字符时并不停止,因而能够写入完整的类结构
      • 第一个参数一个char型指针(指向内存数据的起始地址),与对象结合使用的时候,要在对象地址之前要char做强制类型转换
          char ch[12]="12 3 456 78";  
          ofstream OpenFile("file.txt");  
        if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile.write(ch, 12);  
          OpenFile.close();  

      istream & read ( char * buf , int n ) ;

      功能:从文件中提取 n 个字节数据,写入buf指向的地方中

          char ch[12];  
          ifstream OpenFile("file.txt");  
          if (OpenFile.fail())  
          {  
              cout<<"打开文件错误!"<<endl;  
              exit(0);  
          }  
          OpenFile.read(ch,12);  
          cout << ch;  //运行结果:数组ch的内容为12 3 456 78
          OpenFile.close();  

      注意事项

      (1)程序不再使用文件时,为什么要关闭文件?

      因为:

      • 文件缓冲区是一块小的内存空间.
      • 操作系统限制同时打开的文件数量

      注意:close ( ) 函数关闭文件,但流对象仍然存在。

      (2)文件的默认打开方式为文本文件,要是想以二进制的方式处理,在打开时要用 ios::binary 显式声明。

      (3)针对文本文件操作时,get函数和>>的区别:

      • 在读取数据时,get函数包括空白字符(遇空白字符不停止读取)
      • >>在默认情况下拒绝接受空白字符(遇到空白符停止读取)

      (4)文本文件的读写常使用的方法:使用<<写入文件,使用getline 和 >> 读到内存

      二进制文件的读写常使用的方法:使用istream 类的成员函数read 和write 来实现,

      3.字符串输入输出流(sstream)

      其相应的派生类有istringstream类、ostringstream类、iostringstream类

      sprintf sscanf 和 stringstream的使用

      其实是整型和字符创类型的相互转化:序列化(转成字符串)和反序列化(将字符串中数据提取处理)

      C当中用法:sprintf和sscanf函数

      C++中用法:字符串流

      struct ServerInfo//要读些的信息类
      {
      	char _ip[20];
      	int  _port;
      };
      	//C当中用法
          //将info中数据转成字符串并存入buff中
      	ServerInfo info = { "192.0.0.1", 8000 };
      	char buff[128];//buff的大小不好确定
      	sprintf_s(buff, "%s %d", info._ip, info._port);// 序列化,转成字符串存入buff中
      	
          //将buff中数据格式化输出到rinfo中
      	ServerInfo rinfo;
      	sscanf(buff, "%s%d", rinfo._ip, &rinfo._port);// 反序列化,将字符串buff中数据转成规定格式
      	//空格间隔开了
      	//C++用法
      	//将info中数据转成字符串并存到buff中
          ServerInfo info = { "192.0.0.1", 8000 };
      	stringstream ssm;//字符串流对象
      	ssm << info._ip <<" "<<info._port;//转成字符串
      	string buff = ssm.str();//查看字符串
      	//从字符串提取至rinfo
      	stringstream ssm;
      	ssm.str("127.0.0.1 90");//这两行直接按照下面的写法也行
      	//stringstream ssm("127.0.0.1 90");
      	ServerInfo rinfo;
      	ssm >> rinfo._ip >> rinfo._port;

      补充内容:C/C++中int和字符串类型的转换

      string转int

      • atoi(c库函数、ascll to integer)
      • strtol(c库函数,字符串转成长整型)
      • stoi(stoi是C++的函数,头文件:#include < string >)

      int转string

      • itoa(c库函数)
      • to_string(C++11的函数,可以适应8种类型的重载,将其转换为string,头文件:#include < string >)

      多功能转换

      stringstream

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。