C++对二进制文件的读写操作
时间:2014-11-14 19:27 点击:次
二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。
对二进制文件的操作也需要先打开文件,用完后要关闭文件。在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。
用成员函数read和write读写二进制文件
对二进制文件的读写主要用istream类的成员函数read和write来实现。这两个成员函数的原型为istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
字符指针buffer指向内存中一段存储空间。len是读写的字节数。调用的方式为:
a. write(p1,50);
b. read(p2,30);
上面第一行中的a是输出文件流对象,write函数将字符指针p1所给出的地址开始的50个字节的内容不加转换地写到磁盘文件中。在第二行中,b是输入文 件流对象,read 函数从b所关联的磁盘文件中,读入30个字节(或遇EOF结束),存放在字符指针p2所指的一段空间内。
[例13.14] 将一批数据以二进制形式存放在磁盘文件中。
- #include <fstream>
- using namespace std;
- struct student
- {
- char name[20];
- int num;
- int age;
- char sex;
- };
- int main( )
- {
- student stud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'};
- ofstream outfile("stud.dat",ios::binary);
- if(!outfile)
- {
- cerr<<"open error!"<<endl;
- abort( );//退出程序
- }
- for(int i=0;i<3;i++)
- outfile.write((char*)&stud[i],sizeof(stud[i]));
- outfile.close( );
- return 0;
- }
- #include <fstream>
- using namespace std;
- struct student
- {
- string name;
- int num;
- int age;
- char sex;
- };
- int main( )
- {
- student stud[3];
- int i;
- ifstream infile("stud.dat",ios::binary);
- if(!infile)
- {
- cerr<<"open error!"<<endl;
- abort( );
- }
- for(i=0;i<3;i++)
- infile.read((char*)&stud[i],sizeof(stud[i]));
- infile.close( );
- for(i=0;i<3;i++)
- {
- cout<<"NO."<<i+1<<endl;
- cout<<"name:"<<stud[i].name<<endl;
- cout<<"num:"<<stud[i].num<<endl;;
- cout<<"age:"<<stud[i].age<<endl;
- cout<<"sex:"<<stud[i].sex<<endl<<endl;
- }
- return 0;
- }
与文件指针有关的流成员函数
在磁盘文件中有一个文件指针,用来指明当前应进行读写的位置。在输入时每读入 一个宇节,指针就向后移动一个字节。在输出时每向文件输出一个字节,指针就向后移动 一个字节,随着输出文件中字节不断增加,指针不断后移。对于二进制文件,允许对指针进行控制,使它按用户的意图移动到所需的位置,以便在该位置上进行读 写。文件流提供 一些有关文件指针的成员函数。为了查阅方便,将它们归纳为表13.7,并作必要的说明。成员函数 | 作 用 |
---|---|
gcount() | 返回最后一次输入所读入的字节数 |
tellg() | 返回输入文件指针的当前位置 |
seekg(文件中的位置) | 将输入文件中指针移到指定的位置 |
seekg(位移量, 参照位置) | 以参照位置为基础移动若干字节 |
tellp() | 返回输出文件指针当前的位置 |
seekp(文件中的位置) | 将输出文件中指针移到指定的位置 |
seekp(位移量, 参照位置) | 以参照位置为基础移动若干字节 |
随机访问二进制数据文件
一般情况下读写是顺序进行的,即逐个字节进行读写。但是对于二进制数据文件来说,可以利用上面的成员函数移动指针,随机地访问文件中任一位置上的数据,还可以修改文件中的内容。 [例13.16] 有个学生的数据,要求:- 把它们存到磁盘文件中;
- 将磁盘文件中的第,3,5个学生数据读入程序,并显示出来;
- 将第个学生的数据修改后存回磁盘文件中的原有位置。
- 从磁盘文件读入修改后的个学生的数据并显示出来。
- 由于同一磁盘文件在程序中需要频繁地进行输入和输出,因此可将文件的工作方式指定为输入输出文件,即ios::in|ios::out|ios::binary。
- 正确计算好每次访问时指针的定位,即正确使用seekg或seekp函数。
- 正确进行文件中数据的重写(更新)。
- #include <fstream>
- using namespace std;
- struct student
- {
- int num;
- char name[20];
- float score;
- };
- int main( )
- {
- student stud[5]={1001,"Li",85,1002,"Fun",97.5,1004,"Wang",54,1006,"Tan",76.5,1010,"ling",96};
- fstream iofile("stud.dat",ios::in|ios::out|ios::binary);
- //用fstream类定义输入输出二进制文件流对象iofile
- if(!iofile)
- {
- cerr<<"open error!"<<endl;
- abort( );
- }
- for(int i=0;i<5;i++) //向磁盘文件输出个学生的数据
- iofile.write((char *)&stud[i],sizeof(stud[i]));
- student stud1[5]; //用来存放从磁盘文件读入的数据
- for(int i=0;i<5;i=i+2)
- {
- iofile.seekg(i*sizeof(stud[i]),ios::beg); //定位于第,2,4学生数据开头
- //先后读入个学生的数据,存放在stud1[0],stud[1]和stud[2]中
- iofile.read((char *)&stud1[i/2],sizeof(stud1[0]));
- //输出stud1[0],stud[1]和stud[2]各成员的值
- cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl;
- }
- cout<<endl;
- stud[2].num=1012; //修改第个学生(序号为)的数据
- strcpy(stud[2].name,"Wu");
- stud[2].score=60;
- iofile.seekp(2*sizeof(stud[0]),ios::beg); //定位于第个学生数据的开头
- iofile.write((char *)&stud[2],sizeof(stud[2])); //更新第个学生数据
- iofile.seekg(0,ios::beg); //重新定位于文件开头
- for(int i=0;i<5;i++)
- {
- iofile.read((char *)&stud[i],sizeof(stud[i])); //读入个学生的数据
- cout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<endl;
- }
- iofile.close( );
- return 0;
- }
顶一下
(3)
100%
踩一下
(0)
0%
上一篇:C++对ASCII文件的读写操作
下一篇:C++对字符串流的读写
相关内容:
最新内容
热点内容
- QQ群
-
微信
- 返回首页
- 返回顶部