7.文件操作

二十七、文件操作

    1. I/O流

        头文件 <fstream>

        C++中把对文件的读写操作都封装在以下类中:

        ofstream    对文件的写操作,继承了ostream类的功能

        ifstream    对文件的读操作,继承了istream类的功能

        fstream     对文件的读写操作,继承了ostream\istream类的功能

    2. C++对文本文件的读写操作

        1、创建流对象,通过流对象打开文件

            a.创建流对象并用有参构造打开文件

                ofstream fout(const char* fliename,openmade made);

            b.无参构造创建流对象,再通过成员函数打开文件

                void open( const char *filename );

                void open( const char *filename, openmode mode );

                filename:文件路径

                mode:文件的打开方式

                    ios::app    添加输出

                    ios::ate    当已打开时寻找到EOF

                    ios::binary 以二进制模式打开文件

                    ios::in     为读取打开文件

                    ios::out    为写入打开文件

                    ios::trunc  覆盖存在的文件

            ifstream类 默认只读方式打开文件,文件不存在则失败, r

            ofstream类 默认只写方式打开文件,文件不存在则创建,存在清空打开 w

            fstream类  默认读写方式打开文件,文件不存在则失败, r+

        2、判断文件是否打开成功

            a.使用 !类对象名 的方式进行判断

                if(!fin)    //  失败

                else        //  成功

            b.使用good、fail 成员函数进行判断上一次文件操作是否成功\失败 ,注意返回值

                if(!fin.good()) //  失败  

                else            //  成功

                if(fin.fail())  //  失败

                else            //  成功

        3、读写文件

            流对象 << 数据      写操作

            流对象 >> 变量      读操作

        4、关闭文件

            close();

            注意:只是关闭流对象的当前打开文件,但是流对象依然可以继续打开新文件

    练习

        设计一个学生类并创建对象,然后把对象的内容以文本形式写入stu.txt

        从stu.txt中读取出来,并用该内容实例化一个对象

        注意:在读写内建类型数据时,原有的<< >>运算符就可以直接进行文本读写,

        但是在对类对象进行读写操作时,绝大多数的类成员变量是private,因此无法直接在类外进行读写

        由于ostream/istream是ofstream/ifstream的父类,因此如果在它们里面重载了 << >> 运算符,

        那么除了可以直接通过cout/cin输出输入类对象外,还可以用于直接文本读写类对象,一举两得

    3.C++的随机读写

        C++为文件IO流提供了两套设置文件位置指针的成员函数,目的为了兼容有两个位置指针的操作系统,

        但是UNIX/Linux和windows系统底层只有一个位置指针,使用哪一套都行

        istream &seekg( off_type offset, ios::seekdir origin );

        功能:通过偏移值 + 基础位置 设置 输入流位置指针的位置

        offset:偏移值

        origin:基础位置

            ios::beg    文件开头

            ios::cur    当前位置

            ios::end    文件末尾

        istream &seekg( pos_type position );

        功能:通过 绝对位置 设置输入流位置指针的位置

       

        ostream &seekp( off_type offset, ios::seekdir origin );

        ostream &seekp( pos_type position );

        功能与seekg相似

        pos_type tellg();

        tellg()函数用于输入流,并返回流中"get"指针的当前位置。

        pos_type tellp();

        tellp()函数用于输出流中,并返回在流中当前"put"指针的位置。

        bool eof();

        如果到达相关联的输入文件的末尾,eof()函数返回true,否则返回false。

    4. C++对二进制文件的读写

        1、创建流对象,打开文件

            a.创建流对象并用有参构造打开文件

            b.无参构造创建流对象,再通过open()成员函数打开文件,mode参数增加 ios::binary (windows一定要)

        2、二进制读写

            ostream &write( const char *buffer, streamsize num );

            功能:以二进制方式写入文件

            buffer:待写入数据的内存首地址

            num:要写入的字节数

            注意:C++中文件I/O流的write 只有两种结果,要么全部写入,要么全部失败

                只需要使用good/fail 判断是否写入成功

            istream &read( char *buffer, streamsize num );

            功能:以二进制方式读文件

            buffer:存储数据的内存首地址

            num:要读取的字节数

            streamsize gcount();

            功能: 获取上一次读文件操作时读到的字节数

        注意:在以二进制方式读写对象时,对象成员不应该有指针(以及string)类型,

            因为在写入时只会写入指针成员变量(地址编号),而下次读取该指针变量时,

            该指针所指向的内存极大可能不是指向上次的内存了,因此读到的编号没有意义

        3、关闭文件

   

    一直读二进制文件到末尾:

        while (true)

        {  

            //读操作, read   fin >> obj

            if(fs.eof())

                break;

            //其他操作

        }

       

    5.类型信息识别

        C++中使用typeid运算符可以获取数据类型

        typeid(数据);

        1.返回值是一个类类型对象

        2.该类类型中有一个name成员函数,可以获取数据的类型并转换为字符串

        3.该类重载了 == 运算符 可以判断两个数据类型是否相同

        4.它可以区分父类指针或者引用指向的是哪个子类,但是前提是父子类之间构成多态

    练习:使用C++实现mv命令

        移动文件 mv dest src

            源文件是普通文件

                目标不是当前路径    创建打开目标文件

                    目标只是个路径  新建同名文件,移动删除

                    目标是路径+文件名   存在判断是否覆盖

                                       不存在则新建并移动

                目标是当前路径      重命名 rename

        移动目录

            源文件是目录文件    通过linuxC 目录流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值