• 文件操作的一些函数


        打开文件的方式
        void open(const char* fname, int mode);
        其中mode取值如下:
        ios::in            打开文件进行读操作,若文件不存在,则打开文件失败
        ios::out          打开文件进行写操作,打开文件时会清空原有内容;若文件不存在,则自动建立新文件
        ios::app         打开文件进行写操作,打开文件时不会清空数据,文件指针始终指向文件文件末尾,因此只能在文件尾写数据。若文件不存在,则自动建立新文件
        ios::binary      打开文件为二进制文件,否则为文本文件
        ios::trunc       若打开文件已存在,则清空文件的内容
        ios::ate          打开文件时文件指针指向文件末尾,但可以在文件中的任何地方写数据
        注:
        1.ofstream类将ios::out作为默认模式;ifstream类将ios::in作为默认模式;fstream类没有设置默认模式,必须在创建fstream类对象时指定,如果不指定则根据后面的操作确定模式
        2.可用位操作符OR(|)同时设置几个标志位
        3.同时设置trunc和app,或者设置了trunc却没有设置out,都会导致打开文件失败

      istream& read(char* s, streamsize n):从流中读取n个字符放到s指向的数组中,读取过程中不会检查数据(意味着读取到空格或者
        换行符不会停止读取),也不会自动添加一个null作为字符串结束符,如果碰到EOF则函数结束,并置eofbit和failbit为1;如果流中
        的字符数目超出了指定数目,则剩下的字符依然保存在流中
       
        ostream& write(const char* s, streamsize n):从s指向数组中取出n个字符放到流中,提取过程中不会检查数据(意味着即使读取
        的是null也不会停止提取)
       
        steamsize gcount() const:返回上一次非格式化提取运算符所读取的字符数,即返回的是get()、getline()、ignore()或者read()
        函数所读取的字符数,而不能用于提取operator>>()函数所提取的字符数
        注:对于get()函数,读取的是n-1个字符;对于getline()函数,如果第n个字符不是结束符delim,则读取的是n-1个字符;如果第n个
        字符是结束符delim,则读取的是n个字符,且读取结束符后会将其抛弃,这同前面将的get()和getline()函数是一样的
       
        int peek():返回输入流的下一个字符,如果处于文件末尾,则返回EOF
        注:该函数只是查看输入流中的数据,并不会真正的提取数据并写在标准输出设备上
       
        istream& putback(char c):将一个字符从输入流中丢弃,并用字符ch代替插入到输入流中

        假如我们指向读取文件指定位置之后数据,那么fstream类的seekg()成员函数可以为我们达到目的。
        seekg()函数原型如下:
        istream& seekg( streampos pos );
        istream& seekg( streamoff off, ios::seek_dir dir );
        该函数从istream类继承而来,它被重载了两次,第1个原型将指针定位到离文件开头pos个字节处;第2个原型则将指针定位到距第2个参数
    指定的位置off个字节处。

        假如我们想要在文件指定位置处输出数据,那么fstream类的seekp()成员函数可以为我们达到目的。
        seekp()函数原型如下:
        ostream& seekp( streampos pos );
        ostream& seekp( streamoff off, ios::seek_dir dir );
        一般来说,第2个参数有下列几种可能的值:
        ios::beg     //相对于文件开头的偏移量
        ios::cur     //相对于当前位置的偏移量
        ios::end     //相对于文件结尾的偏移量
       
        streampos tellg():返回输入流中当前指针的位置
        streampos tellp():返回输出流中当前指针的位置
       
        文件状态位
        goodbit             无错误        good()
        eofbit             已到达文件末尾     eof()
        failbit             非致命的I/O错误    fail()
        badbit            致命的I/O错误     bad()

      在VS中可看到文件状态位的定义如下:

    static const _Iostate goodbit = (_Iostate)0x0;
    static const _Iostate eofbit = (_Iostate)0x1;
    static const _Iostate failbit = (_Iostate)0x2;
    static const _Iostate badbit = (_Iostate)0x4;

         关于文件状态位的几个函数:

    iostate rdstate() const:返回流的当前状态位,比如if(input.rdstate() & std::ios::failbit)即通过与运算来判断当前的流状态是否为failbit
    void clear(iostate state = goodbit):重置状态位为state,即先将所有状态位清零,再将状态位设置为state。默认重置状态位为goodbit,即将所有标志位清零;
    你也可以传递参数,如clear(failbit)则重置状态位为failbit。我们一般使用默认值。
    void setstate(iostate state):设置状态位,做法是不清零当前的状态位,而只是将参数对应的状态位置位,即设置状态位为rdstate()|state,即: void ios::setstate (iostate state) { clear(rdstate()|state); }

         注:
        1.对于fstream对象来说,seekp()/seekg()等价,因为读写指针是同一个指针,而且tellg()/tellp()也等价,因为读写指针在同一个位置。
    而对于ifstream/ofstream就需要使用特定函数。

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    const int num = 20;
    struct people
    {
        char name[num];
        float weight;
        float height;
        int age;
        char sex;
    };
    
    int main()
    {
        people p = {"Kevin", 58.5, 179, 23, 'f'};
        people p1 = {"Gary", 49.4, 170, 22, 'm'};
        fstream fp("people.txt", ios::out | ios::binary);
        fp.write((char*)&p, sizeof(p));
        fp.write((char*)&p1, sizeof(p1));
        fp.close();
    
        people temp;
        fp.open("people.txt", ios::in | ios::binary);
        while(fp.read((char*)&temp, sizeof(temp)))
            cout<<temp.name<<"	"<<temp.age<<"	"<<temp.sex<<"	"<<temp.height<<"	"<<temp.weight<<endl;
        fp.close();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    小学四则运算编程实践
    熟悉编程语言
    俄罗斯方块游戏(修改为无敌版)
    2020-2021-1 20201212《信息安全专业导论》第八周学习总结
    如何学好编程
    python day 4 turtle
    python day 3
    20191206《信息安全专业导论》第五周学习总结
    20191206《信息安全专业导论》第四周学习总结
    20191206《信息安全专业导论》第三周学习总结
  • 原文地址:https://www.cnblogs.com/kevinq/p/4492977.html
Copyright © 2020-2023  润新知