VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 6270|回复: 90

《实用C++》第43课 文件IO操作之打开与关闭

  [复制链接]
51_avatar_middle
online_admins 发表于 2018-6-7 00:59:31 | 显示全部楼层 |阅读模式
1、什么是文件的IO操作?
C++的文件操作就是指对文件进行读写的操作,那么 IO 呢?字母 I 就是 Input 的缩写,意为输入,字母 O 就是 Output 的缩写,意为输出。所以文件的 IO 操作就是指文件的输入与输出。输入就是从磁盘上的文件中读取内容到内存中。输出就是将内存中的数据内容输出或者说写入到磁盘的文件中。这么解释大家应该明白了吧?

2、文件的类型:
文件的类型分为文本文件和二进制文件,文本文件又称为ASCII文件,它的每个字节存放一个ASCII码,代表一个字符。二进制文件则是把内存中的数据,按照其在内存中的存储形式原样写在磁盘上存放。比如一个 short 类型的整数20000,在内存中占用2个字节,而按文本形式输出则占5个字节。因此在以文本形式输出时,一个字节对应一个字符,因而便于字符的输出,缺点则是占用存储空间较多。用二进制形式输出数据,节省了转化时间和存储空间,但不能直接以字符的形式输出。所以,大家可以根据自己的需要选择使用文本文件还是二进制文件存储。如果是输出log文件之类的,那肯定就得用文本形式了,二进制的也看不懂啊,对不对?

代码举例:
  1. #include <fstream>
  2. using namespace std;
  3. int main(int argc, char* argv[])
  4. {
  5.     short var = 20000;
  6.     ofstream fs;
  7.     fs.open("d:\\123.txt");
  8.     fs << var;
  9.     fs.close();

  10.     ofstream fs2;
  11.     fs2.open("d:\\456.txt");
  12.     fs2.write((const char*)&var, sizeof(short));
  13.     fs2.close();

  14.     short value = 0;
  15.     ifstream fi;
  16.     fi.open("d:\\456.txt");
  17.     fi.read((char*)&value, sizeof(short));
  18.     return 0;
  19. }
复制代码


3、C++中的文件操作类:
fstream(输入输出文件流):支持文件的输入与输出操作;
ifstream(输入文件流):支持从文件中输入操作;
ofstream(输出文件流):支持向文件写入的操作;
实际上这几个类都是C++标准模板库STL中提供给我们的,现成的,写好的文件流操作类,我们可以直接拿过来用!之前说过本身C++兼容C语言,所以C语言中的文件读写函数仍然支持,比如:fopen、fread、fwrite、fclose 等等。不过C++中的这几个文件流操作类更符合C++的操作习惯,使用起来更为方便,所以,更建议大家使用C++中的文件操作类。

4、文件的打开操作:构造函数与open函数
  1. ofstream fs("z:\\123.txt");
  2. fs.open("z:\\123.txt");
复制代码

这两种操作都是可以的。当前我们这里只使用了第1个参数,即:传入了文件的路径。实际上open函数有多个参数,第2个参数也很常用,表示打开文件的方式,取值有如下:
ios::in
为输入(读)而打开文件
ios::out
为输出(写)而打开文件
ios::ate
初始位置:文件尾
ios::app
所有输出附加在文件末尾
ios::trunc
如果文件已存在则先删除该文件
ios::binary
二进制方式
这些方式是能够进行组合使用的,以“或”运算(“|”)的方式:例如:
  1. ofstream fs;  
  2. fs.open("123.txt", ios::in|ios::out|ios::binary);
复制代码


有的会员马上就会有疑问了,在第2个知识点的时候,我们并没有很明确的使用open函数的第2个参数,可以说是省略了,或者说使用了默认的第2个参数,为什么也好用呢?
实际上:ofstream、ifstream、fstream 的open函数或者构造函数都有默认的打开文件的方式,如果不传第2个参数,那么就用默认的,其值如下:
  1. ofstream fs1("123.txt", ios::out);
  2. ifstream fs2("123.txt", ios::in);
  3. fstream fs3("123.txt", ios::in|ios::out);
复制代码

这回大家明白了吧?

5、文件是否成功打开了呢?
既然文件打开了,但是文件是否打开成功了呢?我们又该如何判断呢?有的会员会说,看看open函数的返回值,返回 false 肯定就表明打开失败了吧?但是open函数的返回值是 void 类型哦,也就是说无返回值,你又该如何判断呢?方法有多种,这里面一一列举给大家,大家喜欢用哪种方式就用哪种:
①、直接 if 判断 fs 对象;
②、用 is_open 方法判断;
③、用 good 方法判断;
④、用 fail 方法判断;
比较常用的还是前两种方法,意思表达明确。建议大家用前两种方法检测文件是否打开成功。具体使用见视频教程讲解!

6、文件流的关闭:
使用 fs.close() 关闭文件流。也就是是文件流对象 fs 跟磁盘文件断开连接。

7、小作业:
咱们课堂上主要是使用 ifstream 和 ofstream 对象来进行文件的操作,大家课后请使用 fstream 文件流来对文件进行读写操作,把课堂上讲解的知识点实现一遍。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38388453/?p=45
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1D_TShrbrpRc-63_ScmcYSg 提取码:d9yx
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^




上一篇:《实用C++》第42课 多态性与虚函数
下一篇:《实用C++》第44课 文件IO操作之读写
78_avatar_middle
在线会员 发表于 2018-6-7 08:16:28 | 显示全部楼层
终于更新了,谢谢
58_avatar_middle
在线会员 发表于 2018-6-7 11:32:42 | 显示全部楼层
终于开更了,,辛苦辛苦!
96_avatar_middle
在线会员 发表于 2018-6-7 11:55:40 | 显示全部楼层
跟着楼主提高自己,谢谢!~~~
98_avatar_middle
在线会员 发表于 2018-6-7 22:42:04 | 显示全部楼层
继续学习 谢谢提供         
34_avatar_middle
在线会员 发表于 2018-6-9 17:03:26 | 显示全部楼层
感谢分享,讲得很棒
44_avatar_middle
在线会员 发表于 2018-6-11 10:43:37 | 显示全部楼层
多谢站长,学习,学习.
82_avatar_middle
在线会员 发表于 2018-6-12 07:38:21 | 显示全部楼层
前面的教程看了好多了
80_avatar_middle
在线会员 发表于 2018-6-12 08:47:44 | 显示全部楼层
坚持学习!
82_avatar_middle
在线会员 发表于 2018-6-12 11:41:10 | 显示全部楼层
感谢分享,讲得很棒
74_avatar_middle
在线会员 发表于 2018-6-12 12:56:54 | 显示全部楼层
看看        
95_avatar_middle
在线会员 发表于 2018-6-12 14:18:36 | 显示全部楼层

终于更新了,谢谢
85_avatar_middle
在线会员 发表于 2018-6-12 16:53:02 | 显示全部楼层
感谢分享,学习一下。
06_avatar_middle
online_vip 发表于 2018-6-12 17:29:51 | 显示全部楼层
我爱学习 学习爱我
80_avatar_middle
online_vip 发表于 2018-6-12 22:30:40 | 显示全部楼层

继续学习 谢谢提供      
63_avatar_middle
在线会员 发表于 2018-6-14 16:03:57 | 显示全部楼层
谢谢老师的讲解,真的很好,很需要
41_avatar_middle
online_vip 发表于 2018-6-16 14:35:38 | 显示全部楼层
感谢分享。
51_avatar_middle
online_vip 发表于 2018-6-16 16:41:00 | 显示全部楼层
支持VC驿站越办越好
49_avatar_middle
在线会员 发表于 2018-6-21 21:27:14 | 显示全部楼层
lkd tjt rhf rhf
22_avatar_middle
在线会员 发表于 2018-6-22 22:02:05 | 显示全部楼层
继续学习 谢谢提供  
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-10-16 04:05

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表