c++ fstream参数_C++ fstream中的read write 函数示例讲解

我们先看一下示例代码:

user obj_cur, obj_sec; //定义user对象 obj_sec

int Write_File(user& obj)

{

fstream fio;

fio.open("C://test/Register.txt", ios::in | ios::out | ios::binary); //打开文件 读/写/二进制

if (!fio) //如果打开失败 则提示出错并退出程序

{

cout << " Open File Failed!" << endl;

return -1;

}

fio.seekg(0, ios::beg); //将指针移到文件开头准备开始查找。一般都是从开头开始找

int count = 0; //初始化记数器为0,这里记录 寻找了第几个人

while (fio.read((char*)&obj_sec, sizeof(obj_sec))) //一次读 sizeof(obj_sec)大小的数据,也就是一个user类大小的信息

{

if ((obj.getAccount() == obj_sec.getAccount())) //如果发现当前读到的信息的帐号 刚才等于我参数obj 的帐号(找到了)

{

fio.seekp(count * sizeof(obj_sec), ios::beg); //将指针从开头移到 count * user信息的长度

fio.write((char*)&obj, sizeof(obj)); //将当前的obj的信息 写到这里(即更新找到的user的相关信息)

fio.close(); //关闭文件

return 0; //退出

}

count++; //如果没找到 计数器加1 继续找

}

return 0;

要点:

----------------------------------

我们先假设 Register.txt 里大致是这样存储的

张三{ name(姓名),money (金额),Account(账号),password(密码),phone(电话),identity(身份证)李四{ name(姓名),money (金额),Account(账号),password(密码),phone(电话),identity(身份证)王五{ name(姓名),money (金额),Account(账号),password(密码),phone(电话),identity(身份证)

我们填上实际的数据

张三 100.00 9999 123 1389999999 4304211911118252 李四 100.00 8888 123 1388888888 4205211911118250 王五 100.00 7777 123 1387777777 4108211911118210

为了好看及好标记,我在每个用户数据后面加个换行回车(实际数据是没有换行的)

张三 100.00 9999 123 1389999999 4304211911118252 (第1个user数据)

李四 100.00 8888 123 1388888888 4205211911118250 (第2个user数据)

王五 100.00 7777 123 1387777777 4108211911118210 (第3个user数据)

假如我们要找的是 李四 (obj参数 为李四),我们要从文件开头开始寻找,即从第1个张三开始找,发现不是,继续找第2个,那找到的李四 应该是 第2个人(count记数器是从0开始。那第2个就是1)

fio.seekp(count * sizeof(obj_sec), ios::beg); //将指针从开头移到 count * user信息的长度

当count=0 时 count * sizeof(obj_sec)=0 即0*(user类的长度)指针在文件最开头,即张三的位置(第1个user)

当count=1 时 count * sizeof(obj_sec) 即指针在1*(user类的长度),即李四的位置(第1个user)

假如我们要找的是 李四 (obj参数 为李四),那找到的李四 应该是 第2个人(count记数器是从0开始。那第2个 count就是1)

Write_File( obj 新李四信息 ) //这个 obj 新李四信息 就是一个 user对象,它带有李四的新的信息(账号是李四的,但电话 金额 密码 身份证都可能变了。要写到文本文件中去)

假设李四的银行帐号(Account是8888), 张三的Account是9999 王五的Account 是77777

程序就在 Register.txt中逐个找,每次只搜索 一个User的长度,从文本开头 先找到 张三,发现张三的Account 与我传递的参数obj 里的Account 不相同 ,就继续找下一个

就找到李四的位置,然后就把新李四信息(包括电话 金额 密码 身份证 写进去,复盖旧的信息,然后退出

----------------------------------

详细分析:

1.首先 Write_File 这个函数会接收一个参数,参数是obj ,这是一个 user类

这个 user 类有 几个 属性,其中一个 是getAccount , 获取user对象的当前银行帐号 Account

然后我们了解一下read 和write函数

read(unsigned char *buf,int num);

read()从文件中读取 num 个字符到 buf 指向的缓存中

write(const unsigned char *buf,int num);

而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换

第一个参数 是缓存 buf指向的内存

可以是数组,也可以是一个对象(类的实例)指向的位置

例如:如果指向数组

int n[5];

in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换

就是从 文件中 读取 长度为5的字节到 数组 n 中

sizeof(n) 就是取 n数组的 大小,缓存 就是 n数组 开始位置

回到我们的代码。前面定义了 obj_sec 是一个user类对象

user obj_cur, obj_sec;

就是从文件中读取 sizeof(obj_sec) 长度的内容到 obj_sec对象中

fio.read((char*)&obj_sec, sizeof(obj_sec))

因为obj_sec 是一个user对象,所以它的长度 就是user类的长度

user类有多长呢

user它里面要存储 money (金额),name(姓名),Account(账号),password(密码),phone(电话),identity(身份证) 加起来的总长度 就是user的长度

所以 Register.txt 里大致是这样存储的

张三{ money (金额),name(姓名),Account(账号),password(密码),phone(电话),identity(身份证)李四{ money (金额),name(姓名),Account(账号),password(密码),phone(电话),identity(身份证)王五{ money (金额),name(姓名),Account(账号),password(密码),phone(电话),identity(身份证)

只不过是以二进制存储的,所以你直接用记事本打开,看不出来

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值