文件操作的一些函数

    打开文件的方式
    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<<"\t"<<temp.age<<"\t"<<temp.sex<<"\t"<<temp.height<<"\t"<<temp.weight<<endl;
    fp.close();

    system("pause");
    return 0;
}

转载于:https://www.cnblogs.com/kevinq/p/4492977.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值