• C++文件读写详解(ofstream,ifstream,fstream)


    相关的头文件:#include <fstream>

    需要相关的类

    fstream提供三种类,实现C++对文件的操作

    ofstream:写操作,由ostream引申而来

    ifstream:读操作,由istream引申而来 

    fstream :同时读写操作,由iostream引申而来 

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

    文件读写的步骤:

    1、包含的头文件:#include <fstream>

    2、创建流

    3、打开文件(文件和流关联)

    4、读写 (写操作:<<,put( ), write( ) 读操作: >> , get( ),getline( ), read( ))

    5、关闭文件:把缓冲区数据完整地写入文件, 添加文件结束标志, 切断流对象和外部文件的连接

    文件的读写:

    1、文本文件的读写:

    方法:

    一次性读写若干字符

           1)使用运算符<< 和 >>进行读写

           功能:

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

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

    代码:

    函数功能:使用<< ,写入文件一行字符


     

    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      ofstream OpenFile("file.txt");  

      if (OpenFile.fail())  

      {  

        cout<<"打开文件错误!"<<endl;  

        exit(0);  

       }  

        OpenFile<<"abc def ghi";  

      OpenFile.close();  

      system("pause");  

    }  

    运行结果:文件中写入内容:abc def ghi

    函数功能:使用>>,从文件读入一个单词


    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      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();  

        system("pause");  

    }  

    运行结果:str的内容为abc,而不是abc def ghi(见空格停止)

           2)使用运算符<<(写)和getline()进行读写

           功能:

           <<:以行为单位输入文件

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

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

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

           1):num - 1个字符已经读入

           2):碰到一个换行标志

           3):碰到一个EOF

    代码:

     

    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      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();  

        system("pause");  

    }  

    运行结果:str的内容为abc def ghi (一直把一行读完)

    一次读写一个字符:

    使用get( )和put( )函数

    函数声明:istream& get(char &c);

    函数功能:使用 get( )函数 把字符1输入到文件

     

    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      char ch='1';  

         ofstream OpenFile("file.txt");  

      if (OpenFile.fail())  

        {  

            cout<<"打开文件错误!"<<endl;  

            exit(0);  

        }  

        OpenFile.put(ch);  

        OpenFile.close();  

        system("pause");  

    }  

    运行结果:把字符1写入文件

    函数功能:使用 put( )函数 把文件中第一个字符输入内存


     

    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      char ch;  

         ifstream OpenFile("file.txt");  

      if (OpenFile.fail())  

        {  

            cout<<"打开文件错误!"<<endl;  

            exit(0);  

        }  

        OpenFile.get(ch);  

        cout<<ch;  

        OpenFile.close();  

        system("pause");  

    }  

    运行结果:把字符1从文件中读到ch(内存)中

    2、二进制文件的读写:

      1)使用运算符get( ) 和 put( )读写一个字节

    功能:

           get( ) :在文件中读取一个字节到内存

    函数原型:ifstream &get(char ch)

           put( ) :在内存中写入一个字节到文件

    函数原型:ofstream &put(char ch)

    代码:

    功能:把26个字符写入文件中


     

    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      char ch='a';  

        ofstream OpenFile("file.txt",ios::binary);  

      if (OpenFile.fail())  

        {  

            cout<<"打开文件错误!"<<endl;  

            exit(0);  

        }  

      for (int i=0;i<26;i++)  

        {  

            OpenFile.put(ch);  

            ch++;  

        }  

        OpenFile.close();  

        system("pause");  

    }  

    运行结果:文件内容为abcdefghijklmnopqlst...z

    功能:把文件中的26个字母读入内存


     

    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      char ch;  

          ifstream OpenFile("file.txt",ios::binary);  

      if (OpenFile.fail())  

        {  

            cout<<"打开文件错误!"<<endl;  

            exit(0);  

        }  

      while (OpenFile.get(ch))  

            cout<<ch;  

        OpenFile.close();  

        system("pause");  

    }  

    运行结果:ch依次为abc...z

       2)使用read()和write()进行读写

      read( ):

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

           函数声明:istream &  read ( char * buf ,  int  n ) ;

    代码:

     函数功能:使用write( )函数,一次从内存向文件写入一行数据


     

    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      char ch[12]="12 3 456 78";  

        ofstream OpenFile("file.txt");  

      if (OpenFile.fail())  

        {  

            cout<<"打开文件错误!"<<endl;  

            exit(0);  

        }  

        OpenFile.write(ch,12);  

        OpenFile.close();  

        system("pause");  

    }  

    运行结果:文件内容12 3 456 78

    write( ):

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

          函数声明:ostream & ostream :: write ( char * buf ,  int  n ) ;

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

          注意:1):该函数遇到空字符时并不停止,因而能够写入完整的类结构

                      2):第一个参数一个char型指针(指向内存数据的起始地址),与对象结合使用的时候,要在对象地址之前要char做强制类型转换。

    函数功能:使用write( )函数,一次从文件向内存写入一行数据


    #include <fstream>  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

      char ch[12];  

         ifstream OpenFile("file.txt");  

      if (OpenFile.fail())  

        {  

            cout<<"打开文件错误!"<<endl;  

            exit(0);  

        }  

        OpenFile.read(ch,12);  

        cout<<ch;  

        OpenFile.close();  

        system("pause");  

    }  

    运行结果:数组ch的内容为12 3 456 78 。

    说明:

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

    因为:1)文件缓冲区是一块小的内存空间.

                2)操作系统限制同时打开的文件数量 

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

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

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

    区别:在读取数据时,get函数包括空白字符(遇空白字符不停止读取)
                >>在默认情况下拒绝接受空白字符(遇到空白符停止读取)
    4、判断文件是否打开的方法:

    if (OpenFile)  

    {  

        cout<<"打开文件失败!";  

        exit(0);  

    }  

    if (OpenFile.fail())  

    {  

        cout<<"打开文件错误!"<<endl;  

        exit(0);  

    }  

    5、判断文件是否结束的方法:
             1)使用成员函数eof()可以检测到这个结束符,如果非0表示文件结束。

     

      while (!OpenFile.eof())  

        {  

        //文件结束时的代码  

        }  

             2)使用流直接检测,如果为0表示文件结束

     

      while (!OpenFile)  

        {  

        //文件结束时的代码  

        }  

             3)使用get函数,读取最后一个结束符时,返回0.读取正常情况下,返回1,并把读取的字符放到ch中

     

      while ( (OpenFile.get(ch) )!=EOF)  

        {  

        //成功时候的代码  

        }  

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

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

    这两个成员函数的原型为:

     

     

    istream& read(char *buffer,int len);  

    ostream& write(const char * buffer,int len);   

    参数说明:字符指针 buffer 指向内存中一段存储空间。len 是读/写的字节数。

    与对象结合写入二进制文件时:

            write函数调用语句:


     

    输出文件流对象名.write((char*)& 对象名,sizeof(<对象所属类名>));  

    输出文件流对象名.write((char*)& 对象数组名[下标],sizeof(<对象所属类名>));  

            read函数调用语句:


     

    输入文件流对象名.read((char*)& 对象名,sizeof(<对象所属类名>));          

    输入文件流对象名.read((char*)& 对象数组名[下标],sizeof(<对象所属类名>));      

    注意:gcount()函数经常和read函数配合使用,用来获得实际读取的字节数。

    二进制文件的随机读写

     

    #include <iostream>  

    #include <fstream>  

    using namespace std;  

    int main(void)  

    {  

      //写文件:二进制存储1234  

      int writeNum1 = 1;  

      int writeNum2 = 2;  

      int writeNum3 = 3;  

      int writeNum4 = 4;  

        ofstream fout("test.txt", ios::out | ios::binary);  

        fout.write(reinterpret_cast<char *>(&writeNum1), sizeof(int));  

        fout.write(reinterpret_cast<char *>(&writeNum2), sizeof(int));  

        fout.write(reinterpret_cast<char *>(&writeNum3), sizeof(int));  

        fout.write(reinterpret_cast<char *>(&writeNum4), sizeof(int));  

        fout.close();  

      //读文件  

        ifstream fin("test.txt",ios::in | ios::binary);  

      if (!fin.good())  

        {  

            cout<<"文件打开错误"<<endl;    

            exit(0);  

        }  

      int readNum = 0;  

      //第一次输出:从第一个数字输出,结果是1 2 3 4  

        fin.seekg(0,ios::beg);  

      while (fin.peek() != EOF)  

        {  

            fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));  

            cout<<readNum<<" ";  

        }  

      cout<<endl;  

      //第二次输出:从第三个数字输出,结果是3 4

      fin.seekg(2 * sizeof(int),ios::beg);//游标移动的次数 = 需要处理数的个数 × int占的字节数  

      while (fin.peek() != EOF)  

        {  

            fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));  

            cout<<readNum<<" ";  

        }  

        cout<<endl;  

         fin.close();  

          system("pause");  

      return 0;  

    }  

  • 相关阅读:
    mybatis-day1
    java基础
    pytest进阶之html测试报告
    pycharm在github上clone项目
    selenium中的显示等待WebDriverWait与条件判断expected_conditions举例
    pytest-html报告中添加报错截图
    Fiddler抓包工具如何设置过滤域名
    os.system运行cmd命令时,命令中嵌套了引号
    Pytest之模块之间共享skipif标记
    Pycharm出现同一目录的py文件不能相互调用的问题
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4371796.html
Copyright © 2020-2023  润新知