C++学习轨迹之文件操作

一.输入输出流基本含义

1.C++中将数据从一个对象到另一个对象的传递抽象为“流”,流分为输入流和输出流,数据的输入输出都是通过I/O流来实现的,将执行I/O操作的类体系称为流类库。
2.C++提供了强大的流类库,有三套实现I/O的方法:第一套是和C语言兼容的I/O库函数;第二套是I/O流类库,在linux适合第二套;第三套是针对Windows程序设计提供的类库。
3.C++通过重载运算符<<和>>支持类和对象的输入输出,是以字节流的形式实现,具有方向性。
4.C++ 专门内置了一些供用户使用的类,在类中封装了可以实现输入输出操作的函数,这些类统称为I/O流类。
5.共有4个标准流类对象:cin对象、cout对象、cerr对象、clog对象;其中后两个都是输出错误信息,只不过cerr是非缓冲方式,而clog对象带有缓冲区,区别是前者立即输出,而后者是先将错误信息放入缓冲区,待缓冲区满了后再进行输出。iostream就是一个类,由它提供的公共接口来实现I/O操作。

二.文件操作

1.文件按组织形式分为文本文件和二进制文件,要进行文件输入输出操作,必须创建一个流,再把这个流与文件相关联。

2.C++提供了三个文件输入输出流类:ofstream(文件输出即写)、ifstream(文件输入即读)、fstream(即可写又可读);并建立了三个相应流即定义流类的对象:out、in、inout;类ios为流类库的基类,其他流类如istream、ostream、iostream都是由该基类派生而来,而ofstream、ifstream、fstream分别由前三个类派生而来。

3.ios::in(打开一个输入文件),ios::out(打开一个输出文件),ios::app(以追加的方式打开一个输出文件),ios::ate(打开一个现成文件并寻找末尾)
ios::nocreate(仅打开一个存在的文件),ios::binary(打开一个二进制文件,默认是文本文件)

4.打开方式:#include <fstream.h>
ifstream in;
in.open("路径名“,ios::nocreate);
if(in.fail())
cout<<文件不存在
in.close

5.文本文件读写:对文本文件进行读写时,要先以某种方式打开文件,然后使用<<>>进行操作即可,
ofstream fout(“文件路径名”)//其中fout为定义的对象流,将fout和文件~相关联,且须注意,这句语句必须连贯写出来,否则会报错
fout<<“你好”<<endl;//通过fout对象将你好输出到该相关联
的文件中
fout.close()
ifstream fin(文件路径名”)//同上,关联文件和对象
if(!fin)
cout<<文件出错
char c[20];
fin>>c;//将该文件的内容读入内存,用内存中的一个数组
来接受从文件读入的内容
fin.close()

6.从上面分析我们可以看出,标准输入输出流将键盘和显示器作为默认的输入输出文件,而使用用户自定义的文件输入输出流就可以自定义相关联的文件进行输入输出,进而完成文件读写。

7.在实际操作过程中,我们会遇到从文件读取内容到数组中时,我们会发现数组遇到空格便停止接受。此时,我们便不能再用fin>>操作,而是用fin.getline(数组名,长度,自定义终结符),否则默认是换行符。
注意:这里必须是字符型数组

8.二进制文件读写操作:文本文件和二进制文件区别:前者是字符流,后者是字节流;两者相同点即任何文件都可以以文本方式或者二进制方式打开,且二进制文件在进行读写操作时应当先进行打开操作。打开有两种方式:第一种是ifstream infile(文件路径名,打开方式–默认是文本文件,如果想以二进制的形式打开,可以ios::binary);第二种是open的形式即inflie.open(文件名,是输入还是输出 | 二进制还是文本形式)

9.对于二进制方式打开的文件,可以使用函数read()和write()进行读写操作
使用方法:infile.read(缓冲区首地址char*,读入的字节数),outfile.write(buff首地址,写入的字节数)。

10.注意:输出文件是写,输入文件是读,n=infile.gcount()//表示实际读取的字节数

11.小细节:打开文件失败很有可能是你的文件路径名不对,应当以/开头,或者文件不存在。

三.随机读写文件

1.前面介绍的文件读写都是按照顺序进行的,称为顺序读写文件,只能按照文件中排列的顺序一个个访问数据,但有些时候,我们需要从文件的某个位置读写即随机读写。
2.实现方式是通过移动文件指针达到随机访问的目的,而移动文件指针的成员函数有seekg()和seekp(),前者是输入流,后者是输出流 。
3.还可以定义既可输入又可输出的文件,如fstream iofile(“文件路径名”,ios::in | ios::out | ios::binary)。
4.iofile.seekg(50,ios::cur)//表示从当前指针往后移50个字节
iofile.seekp(-50sizeof(stud[0],ios::beg)//表示从文件开始位置往前移50个自定义结构体单位大小
iofile.seekg(-50,ios::end)//表示从末尾前移50个字节
iofile.read((char
&(stud[i]),sizeof(stud[i])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值