VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

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

《实用C++》第44课 文件IO操作之读写

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-6-7 23:43:39 | 显示全部楼层 |阅读模式
1、简介:
上节课给大家介绍了各种类型的文件流对象,对文件进行了打开与关闭的操作。那么打开与关闭不是目的,打开文件之后重要的是为了要进行文件的读写操作,不然打开、关闭文件干嘛?对不对?在C++文件流操作中,可以使用多种方法对文件进行读写操作,例如:<<、>>、put、get、getline、read、write 都是可以的。接下来就分别给大家讲解下每个函数怎么用!

2、文件的写操作:
写操作对应的有:<<、put、write 等,我们来看下他们分别都能实现什么样的写文件功能!
①、写文本类型/ASCII码类型的可见字符串:<<、put
示例代码如下:
  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.     if (!fs) return 0;

  9.     fs << var << endl;
  10.     fs << "真的是你吗?" << endl;
  11.     fs.put('Y');
  12.     fs.close();
  13.     return 0;
  14. }
复制代码


大家看到了吧,这就是写文本文件的方式,其中 << 支持的类型比较多,put 只能写单个字符到文件,还是有一定局限性的,所以 put 平时用的比较少。
<< 支持的类型详见:http://www.cplusplus.com/referen ... eam/operator%3C%3C/

②、二进制类型写文件:write
并不一定所有的文件都是文本文件,也并不是所有的功能都要求用文本文件来实现。例如:图片文件就是二进制文件,我们用记事本打开之后发现里面是乱码,根本不是我们用眼睛能看懂的文本文件,所以类似这样的文件就不能用 << 或者 put 来写入了。那么用什么呢?可以用接下来要给大家讲解的 write 函数,他支持文本类型和二进制类型。你只要告诉他内存的地址,以及从这个地址开始要写多少字节的数据到文件就可以了,例如:
  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.     if (!fs) return 0;

  9.     fs.write((char*)&var, sizeof(var));
  10.     fs.close();
  11.     return 0;
  12. }
复制代码


这里面大家可以看到 write 的第一个参数是 char* 类型的,但是不要误以为 write 只能写字符串类型的数据,完全错误!char * 不一定是字符串,里面放的东西可能是字符串,也可能是二进制数据。其实对于 write 来说第一个参数如果写成 void* 可能大家能更好理解一些。也就是一个地址而已,具体这个地址里面的内容是什么,write 不关心。第二个参数就是要一个长度,要从多长的一块内存数据写到文件中。大家明白了吗?


3、文件的读操作:
①、读文本类型/ASCII码类型的文件:>>、get、getline
  1. #include <fstream>
  2. using namespace std;
  3. int main(int argc, char* argv[])
  4. {
  5.     short var = 20000;
  6.     ofstream fs_out;
  7.     fs_out.open("d:\\123.txt");
  8.     if (!fs_out) return 0;
  9.     fs_out << var << endl;
  10.     fs_out.close();

  11.     var = 3000;

  12.     ifstream fs_in;
  13.     fs_in.open("d:\\123.txt");
  14.     if (!fs_in) return 0;
  15.     fs_in >> var;
  16.     char ch = fs_in.get();
  17.     fs_in.close();
  18.     return 0;
  19. }
复制代码

>>支持的类型详见:http://www.cplusplus.com/referen ... eam/operator%3E%3E/
istream::get 详见:http://www.cplusplus.com/reference/istream/istream/get/

还有一个 getline 函数,该函数是从文件中读取一行数据,什么是一行?所谓的一行就是有换行符 \n,或者达到 getline 的缓冲区大小,或者读到文件末尾。
istream::getline 详见:http://www.cplusplus.com/reference/istream/istream/getline/
所以,如果是想把文件中的内容一行一行的读进来,可以使用 getline 函数,还是非常方便的。

  1. #include <fstream>
  2. using namespace std;
  3. int main(int argc, char* argv[])
  4. {
  5.     short var = 20000;
  6.     ofstream fs_out;
  7.     fs_out.open("d:\\123.txt");
  8.     if (!fs_out) return 0;
  9.     fs_out << var << endl;
  10.     fs_out << var + 1 << endl;
  11.     fs_out << var + 2 << endl;
  12.     fs_out.close();

  13.     ifstream fs_in;
  14.     fs_in.open("d:\\123.txt");
  15.     if (!fs_in) return 0;

  16.     char sz[10] = { 0 };
  17.     fs_in.getline(sz, 10);
  18.     fs_in.getline(sz, 10);
  19.     fs_in.getline(sz, 10);
  20.     fs_in.close();
  21.     return 0;
  22. }
复制代码


②、读取二进制文件类型:read
  1. #include <fstream>
  2. using namespace std;
  3. int main(int argc, char* argv[])
  4. {
  5.     short var = 20000;
  6.     ofstream fs_out;
  7.     fs_out.open("d:\\123.txt");
  8.     if (!fs_out) return 0;
  9.     fs_out << var << endl;
  10.     fs_out << var + 1 << endl;
  11.     fs_out << var + 2 << endl;
  12.     fs_out.close();

  13.     ifstream fs_in;
  14.     fs_in.open("d:\\123.txt");
  15.     if (!fs_in) return 0;

  16.     char sz[100] = { 0 };
  17.     fs_in.read(sz, 100);
  18.     fs_in.close();
  19.     return 0;
  20. }
复制代码


具体 read 函数的定义见:http://www.cplusplus.com/reference/istream/istream/read/
也就是说他从指定的文件中读取数据,读取的数据可以是文本类型的也可以是二进制类型的,其实read也不管你想要读取什么东西,我只管读就是了,把读取到的内容放在第一个参数指针指向的内存中,具体读取的字节数就是靠第二个参数指定。

4、小作业:
今天给大家讲解了如何进行文件的读写,介绍了相关的读写文件的函数,那么今天给大家留的小作业就是如何判断读写文件的操作/函数是否成功了呢?以及如何判断是否读到文件末尾了呢?希望大家课后自己实践下!

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

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

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

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

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

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

78_avatar_middle
online_member csa 发表于 2018-6-8 08:52:00 | 显示全部楼层
又出新教程啦。。

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

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

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

回复 支持 反对

使用道具 举报

98_avatar_middle
online_member tomok 发表于 2018-6-8 15:23:37 | 显示全部楼层
谢谢 提供 教程
继续

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

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

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

回复 支持 反对

使用道具 举报

96_avatar_middle
online_member Jer808 发表于 2018-6-8 16:55:36 | 显示全部楼层
先顶!~~~~

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

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

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

回复 支持 反对

使用道具 举报

58_avatar_middle
online_member AxiaoA 发表于 2018-6-8 17:47:37 | 显示全部楼层
辛苦了!连续更新好几个教程!

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

82_avatar_middle
online_member DetectiveY 发表于 2018-6-12 11:42:25 | 显示全部楼层
感谢分享,

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

95_avatar_middle
online_member zjh2008 发表于 2018-6-12 14:19:14 | 显示全部楼层
又出新教程啦。。

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

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

继续学习 谢谢提供      

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

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

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

回复 支持 反对

使用道具 举报

63_avatar_middle
online_member wangjiechun 发表于 2018-6-14 15:39:30 | 显示全部楼层
谢谢老师,真的很好

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

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

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

回复 支持 反对

使用道具 举报

06_avatar_middle
online_vip 1938537171 发表于 2018-6-14 20:54:23 | 显示全部楼层
我爱学习  学习爱我

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

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

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

回复 支持 反对

使用道具 举报

44_avatar_middle
online_member a281288098 发表于 2018-6-16 08:51:48 | 显示全部楼层
版主辛苦.感谢版主,

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

51_avatar_middle
online_vip zxnnnnn 发表于 2018-6-16 17:35:57 | 显示全部楼层
多谢分享。

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

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

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

回复 支持 反对

使用道具 举报

15_avatar_middle
online_member 东佳高科 发表于 4 天前 | 显示全部楼层
aaaaaaaaaaaaaaaaaa

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

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

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

回复 支持 反对

使用道具 举报

56_avatar_middle
online_member coffeemlx 发表于 4 天前 | 显示全部楼层
谢谢楼主提供免费教程!

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

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

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

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

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

GMT+8, 2018-6-24 16:59

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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