当前课程知识点:C/C++:从基础语法到优化策略 > Final Exam > Final exam > 3.9 File input and output
返回《C/C++:从基础语法到优化策略》慕课在线视频课程列表
大家好 我们最后讲一下文件的读写
也就叫文件的输入和输出
我们后面讲的是使用c++进行文件的输入和输出文件的读写
那么这个要比c语言的文件读写
要简单和方便很多
如果我们要对文件进行写操作
也是把内容写到文件里面去也叫output
那么基本上是这么几步
第一步呢 就是先include相应头文件
然后创建一个ofstream的对象
创建好对象之后 我们可以调用它的函数open
open函数去把这个文件打开
打开的时候 如果这个文件不存在 其实就是创建一个新文件
那么然后 我们怎么去往这里面写内容
往这里面写 这写的过程中其实它的用法
ofstream跟我们的cout是完全一样的 这个完全一样的用法
我们随后在例子里面会给大家展示
最后 写完之后 我们要把文件关闭 这是整个的流程
那么我们来看这个例子 这个例子
这个例子是这样的
我们来看 首先 按照刚才里面是把这个头文件
include进来 然后创建一个ofstream对象
创建好之后 open这个文件如果不存在 就会把它打开
如果存在会怎么办
会出错还是怎么
大家可以自己练习一下如果这个文件存在会发生什么 会发生什么
还有就是如果创建失败 会怎么处理
文件如果创建失败会怎么样
但这个代码里没有这个的处理操作文件创建失败
好 我们再往下看
那么下一步就说让你输入Enter the make and model of automobile
他说让你输入一辆汽车 汽车的信息那就是
然后他说getline automobile 他就把这个这个信息填到automobile
automobile 是什么类型 那我们来看看是个字符串
然后他又会从输入里面读一个字符串
赋给automobile这个变量
然后让你去输这个model year 就是这辆车是哪一年的
你的输入给year是个整数
然后再说 Enter the original asking price就是它的价格
那得把它输给a这个价格
然后再乘上一个折扣是d这个价格
然后乘了一个0.913然后赋给d_price a_price d_price
那么我们获得这些信息之后后面才是输出
如果我们要把这些信息打印到屏幕上
cout fixed来控制它的格式
precision也是控制他的格式的 setf这些都是一样
那么 真正的输出是从这儿开始
然后我说make and model
然后把刚才用户输入的输出去 哪一年输出去
这个 这个Was asking 这个把这价格输出去
Now asking 就是然后把这两个价格都输出来
这个是输出到屏幕上 我们很容易理解 看代码就懂了
那么如果输出到文件 怎么做呢
大家看 其实除了把cout换成outFile
其他没有任何变化 用法是完全一样的
这都是stream cout和output outFile 他们都是stream
他们的用法是完全一样的 你这样去用
然后把out 当然你要记得唯一不同的是outFile 要open要close 要关闭掉
然后结束 那么我们来看一看这个程序 去运行一下啊 编译一下
outFile 运行 他会问
model汽车是什么 什么汽车比较好呢
benz 哪一年的 2020年 多少钱呢 30万元吧
那么这样我们看到他会把这个信息
这个信息打到屏幕上了
按说应该有同样的信息打印到那个文件里面
那个文件叫什么名字来着
运行的时候 我们那个文件叫carinfo.txt
我们来看这个文件存在不 在当前目录下
carinfo 在这存在了刚创建的
那么 这个信息跟刚刚打印到屏幕上的信息是完全一样的
所以说 文件我们会向屏幕输出
那么我们也就会向文件来输出了 这是输出
好我们再来看一下输入也就是如何从文件里面去读
那么我们前面讲的输出是跟cout的很像 那输入就跟cin很像了
的确如此如果是 你要是输入的话
跟刚才一样 头文件包进来 但是要就要创建一个ifstream 这个对象
然后由ifstream 这个对象也是open
这个open打开一个文件
既然你要读文件 那这个文件应该是存在的
如果他不存在会要怎么办 不存在怎么办
所以说 那我们要做一些错误处理 错误处理让你的程序稳定一些
最后读完之后要close 要关掉
读的操作跟cin一样 用这个符号 两个大于好 在一起
你也可以用get getline等等其他的函数来做
也就是说这个里面cin 和 ifstream的用法是
你可以认为是几乎完全一样的
我们来看一看这个例子 这个例子
我们有一个例子 叫什么名字 又忘了 sumafile
这个例子是这样的 我们来看
首先main函数 当然include的这边都有了
include fstream 还有 cstdlib 和SIZE 60定义了
然后using namespace 然后我们创建一个文件名的变量数组
然后我们就会让用户输一个文件名进来
输一个文件名进来最长是size 不能太多了
把它读到这个变量里面去把英文输入
然后用inFile把这个文件打开 把这个文件打开
打开之后如果打开失败了
那就是如果is_open是True的话就成功
is_open是false 那就是取反
那就是如果没有打开 成功打开 那么我们就干什么
我们就可以说 打印一个信息
说不能打开这个Can not open the file filename
programming terminating程序要终止 然后exit
然后就把他这个 这个实际上是一个宏 那个FAILURE是个1就表示程序终止
这个的话就会运行程序告诉操作系统我要程序异常退出了
但一般来说不建议大家用这个
因为exit在这一旦执行 他就相当于把程序立马就杀死
不会做任何其他的事情 就是到此为止
很多时候 我们一个比较大的程序 你要退出它的时候 你需要做一些善后处理
善后处理那么一般不要这样做 一般不要这样做
好我们来看 如果打开成功 那就继续往下执行了
我们希望做什么
其实我们希望从一个文件里读一些浮点数 然后把它求和
这是sum的和 count是读了几个
那么inFile 那这就是怎么读呢
就inFile到value这样就是一个个的值就读进来了 value是 double
inFile is good
这个就等价于这个 这个是一样的
inFile is good 就是说没有问题
读起来一切很顺利 那我们就count++读了一个
把这个值sum加起来求和 然后再读一个一直循环
只要good 那就继续读
除非碰到这个EOF end of file就文件结尾或者其他的异常
那他就停下停下那么如果是
停下之后呢 他会判断一下
if inFile EOF end of file就表示这个文件已经读完了 就是会异常有问题
如果是fail就是出错了
然后其他原因是其他原因 停下了
那么count等于零 如果等于零就是表示这里面一个数据都没读到
count等于零 这是if else的用法
else 如果不是零那说明我读到一些数据 那说我读到了几个数据
他们的和是多少
他们的平均值是多少 打印出来
最后把文件关闭 文件关闭
退出所以这样的一个程序
那么我们 我在这准备了一个文件 不是这个
data.txt 吧 里面存着1 3 5 5.5 7跟9 这几个数而且分两行
而且是用这个隔开
那么我们来试一试去读它 首先我们要编译
sumafile 读的话运行它会让我们输入这个文件名
如果我们不小心输错了
他说Program terminating 就表示在这里
前面
如果读不到文件
那么这个时候is_open是false 那就会退出
好 我们再运行一次
读这个文件是我们这个文件 data.txt回车
一切很正常 他说end of file reached
因为这个里面只有这个数字 他读到这个文件结尾
他就说 读到五个 然后这和是25.55平均值是5.11这样
那么如果这里面我放个字母会怎么办
放个字母 他第一个和第二个之间放个字母 那么我们
data.txt 大家想想他会引起什么错误 我们再来看一下代码
刚才如果读到文件 文件结尾表示顺利读完文件
那就这个 肯定不是这个 对吧 Fail 还是其他
我们来看运行
这个输出是Input terminated by data mismatch
我们来看mismatch是在哪里
这里input是Failed 就说格式不对
就这样 提示
这是 这就是这个例子 这是这个例子
当然 如果是零就是说 No data processed
如果什么时候让他等于零呢 比如说我在这 加个d
那这个时候他可能就一个也读不到了
因为刚才在之前还读到了一个 那现在的话
那可能一个都读不到了
data.txt 是的 他说data mismatch No data processed
所以这个就是我们的 就是读文件
其实读文件跟从输入里面去读
他都是一样的 都是一样的
用法没有明显的区别
-Quiz 1
-Quiz 2
-3.3 Relational expressions (> < ==)
-3.5 Branching statements (if else)
-3.8 break and continue statements
-Quiz 3
-4.4 Structures, Unions and Enumerations
-Quiz 4
-5.3 Allocate memory: C++ style
-Quiz 5
-6.3 Recursion and pointer to functions
-Quiz 6
-Quiz 7
-8.1 C/C++ with ARM development board
-Quiz 8
-9.2 Constructors and destructors
-Quiz 9
-10.1 Operators in cv::Mat in OpenCV
-10.4 Automatic conversions and type casts for classes
-Quiz 10
-11.1 Dynamic memory and classes
-11.2 New and improved String class
-11.3 Using pointers to objects
-Quiz 11
-12.2 Static and dynamic binding
-12.3 Access control: protected
-12.4 Inheritance and dynamic memory allocation
-Quiz 12
-13.1 Constructor and assignment
-13.2 Classes with object members
-Quiz 13
-14.1 CNN for image classification
-Quiz 14
-15.3 RTTI and type cast operators
-Quiz 15
-Final exam







