C++用read()和write()读写二进制文件的超详细教程_第1页
C++用read()和write()读写二进制文件的超详细教程_第2页
C++用read()和write()读写二进制文件的超详细教程_第3页
C++用read()和write()读写二进制文件的超详细教程_第4页
C++用read()和write()读写二进制文件的超详细教程_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++用read()和write()读写二进制文件的超详细教程目录前言C++ostream::write()方法写文件C++istream::read()方法读文件总结

前言

通过前一节的学习,读者了解了以文本形式读写文件和以二进制形式读写文件的区别,并掌握了用重载的和运算符实现以文本形式读写文件。在此基础上,本节继续讲解如何以二进制形式读写文件。

不过介绍具体的实现方法前,先给读者介绍一下相比以文本形式读写文件,以二进制形式读写文件有哪些好处?

举个例子,现在要做一个学籍管理程序,其中一个重要的工作就是记录学生的学号、姓名、年龄等信息。这意味着,我们需要用一个类来表示学生,如下所示:

classCStudent

charszName[20];//假设学生姓名不超过19个字符,以'\0'结尾

charszId[l0];//假设学号为9位,以'\0'结尾

intage;//年龄

前面章节中,我们学会了如何以文本形式读写文件,如果使用此方式存储学生的信息,则最终的文件中存储的学生信息可能是这个样子:

MichealJackson11092341217

TomHanks11092341318

要知道,这种存储学生信息的方式不但浪费空间,而且后期不利于查找指定学生的信息(查找效率低下),因为每个学生的信息所占用的字节数不同。

这种情况下,以二进制形式将学生信息存储到文件中,是非常不错的选择,因为以此形式存储学生信息,可以直接把CStudent对象写入文件中,这意味着每个学生的信息都只占用sizeof(CStudent)个字节。

值得一提的是,要实现以二进制形式读写文件,和将不再适用,需要使用C++标准库专门提供的read()和write()成员方法。其中,read()方法用于以二进制形式从文件中读取数据;write()方法用于以二进制形式将数据写入文件。

C++ostream::write()方法写文件

ofstream和fstream的write()成员方法实际上继承自ostream类,其功能是将内存中buffer指向的count个字节的内容写入文件,基本格式如下:

ostreamwrite(char*buffer,intcount);

其中,buffer用于指定要写入文件的二进制数据的起始位置;count用于指定写入字节的个数。

也就是说,该方法可以被ostream类的cout对象调用,常用于向屏幕上输出字符串。同时,它还可以被ofstream或者fstream对象调用,用于将指定个数的二进制数据写入文件。

同时,该方法会返回一个作用于该函数的引用形式的对象。举个例子,obj.write()方法的返回值就是对obj对象的引用。

需要注意的一点是,write()成员方法向文件中写入若干字节,可是调用write()函数时并没有指定这些字节写入文件中的具体位置。事实上,write()方法会从文件写指针指向的位置将二进制数据写入。所谓文件写指针,是是ofstream或fstream对象内部维护的一个变量,文件刚打开时,文件写指针指向的是文件的开头(如果以ios::app方式打开,则指向文件末尾),用write()方法写入n个字节,写指针指向的位置就向后移动n个字节。

下面的程序演示了如何将学生信息以二进制形式写入文件:

#includeiostream

#includefstream

usingnamespacestd;

classCStudent

public:

charszName[20];

intage;

intmain()

CStudents;

ofstreamoutFile("students.dat",ios::out|ios::binary);

while(cins.szNames.age)

outFile.write((char*)s,sizeof(s));

outFile.close();

return0;

输入:

Tom60↙

Jack80↙

Jane40↙

^Z↙

其中,↙表示输出换行符,^Z表示输入Ctrl+Z组合键结束输入。

执行程序后,会自动生成一个students.dat文件,其内部存有72字节的数据,如果用记事本打开此文件,可能看到如下乱码:

Tom烫烫烫烫烫烫烫烫Jack烫烫烫烫烫烫烫蘌Jane烫烫烫烫烫烫烫

值得一提的是,程序中第13行指定文件的打开模式为ios::out|ios::binary,即以二进制写模式打开。在Windows平台中,以二进制模式打开文件是非常有必要的,否则可能出错。

另外,第15行将s对象写入文件。s的地址就是要写入文件的内存缓冲区的地址,但是s不是char*类型,因此要进行强制类型转换;第16行,文件使用完毕一定要关闭,否则程序结束后文件的内容可能不完整。

C++istream::read()方法读文件

ifstream和fstream的read()方法实际上继承自istream类,其功能正好和write()方法相反,即从文件中读取count个字节的数据。该方法的语法格式如下:

istreamread(char*buffer,intcount);

其中,buffer用于指定读取字节的起始位置,count指定读取字节的个数。同样,该方法也会返回一个调用该方法的对象的引用。

和write()方法类似,read()方法从文件读指针指向的位置开始读取若干字节。所谓文件读指针,可以理解为是ifstream或fstream对象内部维护的一个变量。文件刚打开时,文件读指针指向文件的开头(如果以ios::app方式打开,则指向文件末尾),用read()方法读取n个字节,读指针指向的位置就向后移动n个字节。因此,打开一个文件后连续调用read()方法,就能将整个文件的内容读取出来。

通过执行write()方法的示例程序,我们将3个学生的信息存储到了students.dat文件中,下面程序演示了如何使用read()方法将它们读取出来:

#includeiostream

#includefstream

usingnamespacestd;

classCStudent

public:

charszName[20];

intage;

intmain()

CStudents;

ifstreaminFile("students.dat",ios::in|ios::binary);//二进制读方式打开

if(!inFile){

cout"error"endl;

return0;

while(inFile.read((char*)s,sizeof(s))){//一直读到文件结束

couts.szName""s.ageendl;

inFile.close();

return0;

程序的输出结果是:

Tom60

Jack80

Jane40

注意,程序中第18行直接将read()方法作为while循环的判断条件,这意味着,read()方法会一直读取到文件的末尾,将所有字节全部读取完毕,while

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论