VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 591|回复: 21

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

[复制链接]
51_avatar_middle
online_admins Syc 发表于 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 文件流来对文件进行读写操作,把课堂上讲解的知识点实现一遍。

第43课免费试看,下载地址回复后可见:
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:http://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

78_avatar_middle
online_member csa 发表于 2018-6-7 08:16:28 | 显示全部楼层
终于更新了,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

58_avatar_middle
online_member AxiaoA 发表于 2018-6-7 11:32:42 | 显示全部楼层
终于开更了,,辛苦辛苦!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

96_avatar_middle
online_member Jer808 发表于 2018-6-7 11:55:40 | 显示全部楼层
跟着楼主提高自己,谢谢!~~~

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
online_member tomok 发表于 2018-6-7 22:42:04 | 显示全部楼层
继续学习 谢谢提供         

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

34_avatar_middle
online_member Sinyon 发表于 2018-6-9 17:03:26 | 显示全部楼层
感谢分享,讲得很棒

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

44_avatar_middle
online_member a281288098 发表于 2018-6-11 10:43:37 | 显示全部楼层
多谢站长,学习,学习.

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member ha521ha 发表于 2018-6-12 07:38:21 | 显示全部楼层
前面的教程看了好多了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
online_member zp521 发表于 2018-6-12 08:47:44 | 显示全部楼层
坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member DetectiveY 发表于 2018-6-12 11:41:10 | 显示全部楼层
感谢分享,讲得很棒

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-6-12 12:56:54 | 显示全部楼层
看看        

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

95_avatar_middle
online_member zjh2008 发表于 2018-6-12 14:18:36 | 显示全部楼层

终于更新了,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

85_avatar_middle
online_member 99099800 发表于 2018-6-12 16:53:02 | 显示全部楼层
感谢分享,学习一下。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

06_avatar_middle
online_vip 1938537171 发表于 2018-6-12 17:29:51 | 显示全部楼层
我爱学习 学习爱我

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
online_vip lanyihr888 发表于 2018-6-12 22:30:40 | 显示全部楼层

继续学习 谢谢提供      

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

63_avatar_middle
online_member wangjiechun 发表于 2018-6-14 16:03:57 | 显示全部楼层
谢谢老师的讲解,真的很好,很需要

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

41_avatar_middle
online_vip liguolong 发表于 2018-6-16 14:35:38 | 显示全部楼层
感谢分享。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

51_avatar_middle
online_vip zxnnnnn 发表于 2018-6-16 16:41:00 | 显示全部楼层
支持VC驿站越办越好

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

49_avatar_middle
online_member yuanpinq 发表于 3 天前 | 显示全部楼层
lkd tjt rhf rhf

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
online_member supersct 发表于 前天 22:02 | 显示全部楼层
继续学习 谢谢提供  

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

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

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

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

GMT+8, 2018-6-24 17:07

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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