C++文件读写

打开模式

in:打开文件时做读操作;

out:打开文件时做写操作;

app:在每次写之前找到文件尾;

ate:打开文件后立即将文件定位在文件尾;(与ios::app存在区别)

trunc:打开文件时清空已存在的文件流;

binary:以二进制模式进行IO操作;(默认时采用的是 文本文件模式)

ios::out            写打开文件,无文件则创建,有则清空原文件

ios::in             读打开文件,无文件则打开失败,有则打开文件,不清空文件

ios::in|ios::out  读写打开文件,无则打开失败,有则不清空打开;文件指针在开头

ios::in|ios::app  读写打开文件,无则创建,有则打开,不清空文件指针在开头,只能在文件尾写

ios::out|ios::app 写打开文件,无则创建,有则打开,不清空,文件指针在开头,但只能在文件尾写,不能读

有效组合:

并不是所有的打开模式都可以同时制定,有些模式组合是没有意义的,例如:in和trunc,准备读取文件流,但是trunc清空了文件流。

out:打开文件时做写操作,删除已经存在的数据;

out  |  app:打开文件时做写操作,在文件尾写入,不清空已经存在的数据;

out  |  trunc:打开文件时做写操作,删除已经存在的数据,与out模式相同;(之所以相同 是因为默认的构造函数就是用  ios::out|ios|trunc)

in:打开文件时做读操作;

in  |  out打开文件时做读写操作,并定位于文件的开头处,不清空已经存在的数据;

in  |  out  |  trunc:打开文件时做读写操作,删除文件中已经有的数据;

当文件同时以in out模式打开时,不会清空已有数据;

如果只使用了out,而没有指定in模式,则会清空已有数据;

如果使用了trunc,不论是否使用了in,都会清空已有的数据(前提是有ios::out);

ifstream 对象 提供默认 文件模式 ios::in;

ofstream 对象提供默认 文件模式 ios::out|ios::trunc;

fstream 对象不提供默认的 文件模式  因此只能自己敲了;

​​​​​​​写文件步骤

1包含头文件

#include <fstream>

2创建流对象

ofstream ofs;

3打开文件

ofs.open("文件路径",打开方式);

4写数据

ofs << "写入的数据";

5关闭文件

ofs.close();

​​​​​​​读写操作

  1. put() 

put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。

  1. get() 

get()函数比较灵活,有3种常用的重载形式:

 1.一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。

2.另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。

3.还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='/n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'/n'。例如:

file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。

  1. 读写数据块 

  要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:

read(unsigned char *buf,int num); 

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

read()从文件中读取 num 个字节到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。

  例:

unsigned char str1[]="I Love You"; 

int n[5]; 

ifstream in("xxx.xxx"); 

ofstream out("yyy.yyy"); 

out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中 

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

in.close();out.close();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值