参考:http://www.weixueyuan.net/view/6413.html

总结:

  二进制文件的读写稍微麻烦一些,对二进制文件的读写同样需要打开文件和关闭文件,打开和关闭方式与文本文件相同,只不过需要在打开方式上加上ios::binary以指明以二进制方式进行读写。

  对于文本文件而言,我们只能用ofstream类定义对象用于输出到文件,用ifstream类定义对象用于从文件中输入,而对于二进制文件而言,除了可以这么做以外,我们还可以用fstream类定义对象既能用于从文件输入,又能输出到文件中。

  针对二进制文件的读写,输入输出类中定义了专门的函数read和write,这两个都是类的成员函数。   

  istream & read ( char * buffer, int size );
  ostream & write ( const char * buffer, int size );
  char指针buffer是指向内存中的一段存储空间,size是存储空间的大小,也即需要读写的内容的字节数。

  有时我们只需要获取某个指定位置的数据而已,此时如果需要将数据全部读入再找到对应位置数据实在是效率太低。为此系统为我们提供了一些操作文件读写指针位置的成员函数,我们可以使用这些函数,将文件读写指针移动到指定位置并操作其中的数据。

函数 用途
gcount ( ) 返回最后一次输入所读入的字节数
tellg ( ) 返回输入指针的当前位置
seekg ( 文件中的位置 ) 将输入文件中指针移动到指定的位置
seekg ( 位移量, 参照位置 ) 以参照位置为标准移动指针
tellp ( ) 返回输出文件指针当前位置
seekp ( 文件中的位置 ) 将输出文件中指针移动到指定的位置
seekp ( 位移量, 参照位置 ) 以参照位置为为标准移动指针

---------------------------------------------------------

二进制文件的读写稍微麻烦一些,对二进制文件的读写同样需要打开文件和关闭文件,打开和关闭方式与文本文件相同,只不过需要在打开方式上加上ios::binary以指明以二进制方式进行读写。

对于文本文件而言,我们只能用ofstream类定义对象用于输出到文件,用ifstream类定义对象用于从文件中输入,而对于二进制文件而言,除了可以这么做以外,我们还可以用fstream类定义对象既能用于从文件输入,又能输出到文件中。

针对二进制文件的读写,输入输出类中定义了专门的函数read和write,这两个都是类的成员函数,它们的函数原型为:

istream & read ( char * buffer, int size );
ostream & write ( const char * buffer, int size );

char指针buffer是指向内存中的一段存储空间,size是存储空间的大小,也即需要读写的内容的字节数。有了这两个用于读写二进制文件的函数,我们通过示例来看一下如何使用这两个函数。

例1:

#include <iostream>
#include <fstream>
using namespace std; int main()
{
int A[ ][ ] = { { , , , , , , , , , },
{ , , , , , , , , , },
{ , , , , , , , , , } };
int B[ ][ ];
int i, j; for( i = ; i < ; i++ )
{
for( j = ; j < ; j++ )
{
cout << A[ i ][ j ] <<" ";
}
cout << endl;
}
cout << endl; //*******************************************
ofstream output( "test.txt", ios::out | ios::binary );
if( ! output )
{
cerr << "Open output file error!" << endl;
exit( - );
} output.write ((char *) A, sizeof( A ) );
for( i = ; i < ; i++ )
{
for( j = ; j < ; j++ )
{
//output.write ( ( char * ) & A [ i ][ j ], sizeof( A [ i ][ j ] ) );
}
} output.close(); //*******************************************
ifstream input( "test.txt", ios::in | ios::binary );
if( ! input )
{
cerr << "Open input file error!" << endl;
exit( - );
} input.read( ( char * ) & B , sizeof( B ) );
for( i = ; i < ; i++ )
{
for( j = ; j < ; j++ )
{
//input.read ( ( char * ) & B[ i ][ j ], sizeof( B[ i ][ j ] ));
}
} for( i = ; i < ; i++ )
{
for( j = ; j < ; j++ )
{
cout << B[ i ][ j ] <<" ";
}
cout << endl;
} //*******************************************
int temp;
input.seekg( 20 * sizeof( int ), ios::beg );
input.read( ( char * ) & temp, sizeof( int ));
cout << temp << endl; input.close(); return ;
}

这个例子的主要功能就是先将一个二维数组以二进制的方式写入到一个test.txt文件中,之后再从这个文件中读出其中的数据赋值给另外一个数组。我们来细看一下这个函数的主函数,我们一开始定义了一个数组A[ 3 ][ 10 ],并赋了初值,之后又定义了另一个数组B[ 3 ][ 10 ],用于存放从文件中读入的数据。程序先将A[ 3 ][ 10 ]数组中的数据打印出来。之后定义一个ofstream类的对象,以二进制方式打开文件,这种文件打开方式和文本文件打开方式是一样的,检测文件是否打开方法也是一样的。文件正常打开之后,我们就开始将A[ 3 ][ 10 ]数组中的数据以二进制的形式输出到文件中,此时我们通过ofstream类的对象调用write函数,因为write函数的第一个参数为char指针,因此需要进行一次强制类型转换,第二个参数给出了数组A[ 3 ][ 10 ]在内存中所占空间大小。因为数组在内存中是连续存储的,因此我们可以只用这么一个语句,就将所有的数组内容以二进制的方式写入到文本中,当然如果我们想一个一个数据的输出到文件也不是不可以的,注释掉的那个语句就是一个一个元素输出的。之后输出数据操作结束,关闭文件。

接下来程序开始从文件中读入数据,打开文件也是和打开文本文件是一样的,只是在打开方式处添加了ios::binary以指明以二进制方式打开文件。同样的,我们也可以利用一个语句就将文件中的所有数据都读入到B[ 3 ][ 10 ]数组中。之后我们将B[ 3 ][ 10 ]数组中的数据打印出来。

当然,在程序设计过程中,我们有时候并不会像本例这样的,每次都将一堆数据全部存入文件或者将一堆数据全部读入到内存,很可能我们只需要获取某个指定位置的数据而已,此时如果需要将数据全部读入在找到对应位置数据实在是效率太低。为此系统为我们提供了一些操作文件读写指针位置的成员函数,我们可以使用这些函数,将文件读写指针移动到指定位置并操作其中的数据,具体函数见下表。

函数 用途
gcount ( ) 返回最后一次输入所读入的字节数
tellg ( ) 返回输入指针的当前位置
seekg ( 文件中的位置 ) 将输入文件中指针移动到指定的位置
seekg ( 位移量, 参照位置 ) 以参照位置为标准移动指针
tellp ( ) 返回输出文件指针当前位置
seekp ( 文件中的位置 ) 将输出文件中指针移动到指定的位置
seekp ( 位移量, 参照位置 ) 以参照位置为为标准移动指针

表中所列函数以“g”(get的首字母)结尾的函数都是用于输入的函数,而以“p”(put的首字母)结尾的函数都是用于输出的函数。函数中有提到参照位置,在系统中定义了三种参照位置:

  • ios::beg 所打开文件的开头,这是默认值
  • ios::cur 文件读写指针当前的位置
  • ios::end 文件结尾

在本节例1中程序主函数的最后我们使用seekg将文件读写指针以文件开头为标准移动20个int型数据,此时指针指向的是第三行第一列的数据,然后我们用read函数将数据读入到temp中,输出temp结果确实是第三行第一列中的数据9。

8.7 C++二进制文件读写操作的更多相关文章

  1. C++学习49 对二进制文件的读写操作

    二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件.因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文 ...

  2. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  3. [转载:]Fortran 二进制文件读写

    一些朋友总是咨询关于二进制文件的读写和转化.这里就我自己的理解说一说. 一).一般问题 二进制文件与我们通常使用的文本文件储存方式有根本的不同.这样的不同很难用言语表达,自己亲自看一看,理解起来会容易 ...

  4. Qt 学习之路:二进制文件读写

    在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice提供了read().readLine()等基本的操作.同时,Qt 还提供了更高一级的操作:用于二进制的 ...

  5. Qt 学习 之 二进制文件读写

    在上一章中,我们介绍了有关QFile和QFileInfo两个类的使用.我们提到,QIODevice提供了read().readLine()等基本的操作.同时,Qt 还提供了更高一级的操作:用于二进制的 ...

  6. python里文件读写操作

    文件读写操作一种基本操作,但是里面也存在很多需要注意的问题,例如字符编码.内存缓冲.指针位置等等.如果忽视这些问题就会引起很多不必要的麻烦.简单来说,文件的读写分为几个过程: 打开文件,并定义操作文件 ...

  7. JAVA核心技术I---JAVA基础知识(二进制文件读写和zip文件读写)

    一:二进制文件读写 (一)写文件 –先创建文件,写入数据,关闭文件 –FileOutputStream, BufferedOutputStream,DataOutputStream –DataOutp ...

  8. 8.6 C++文本文件的读写操作

    参考:http://www.weixueyuan.net/view/6412.html 总结: 文件类型: 计算机上的文件其实是数据的集合,对文件的读写归根结底还是对数据的读写操作.文件可以大致分为两 ...

  9. C# System.IO和对文件的读写操作

      System.IO命名空间中常用的非抽象类 BinaryReader 从二进制流中读取原始数据 BinaryWriter 从二进制格式中写入原始数据 BufferedStream 字节流的临时存储 ...

随机推荐

  1. 数据库SQL的分组函数

    分组函数:(五个) 1···max(expr):求expr的最大值 }\ 2···min(expr):求expr的最小值 }-- 数据类型是有规定的 3···sum(expr):求expr的总和 }- ...

  2. Linux+DDoS deflate 预防DDoS攻击

    使用DDoS脚本防止DDoS攻击   使用DDoS脚本防止DDoS攻击: DDoS概述: 分布式拒绝服务(DDoS:Distributed Denial of Service)攻击,指借助于客户/服务 ...

  3. noip2016海港

    题目描述 Description 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只 ...

  4. JDK安装与配置(Windows 7系统)

    1.前言 安装之前需弄清JDK.JRE.JVM这几个概念,不然稀里糊涂不知道自己在装什么. (1)什么是java环境:我们知道,想听音乐就要安装音乐播放器,想看图片需要安装图片浏览器,同样道理,要运行 ...

  5. 基于CSS属性display:table的表格布局的使用

    项目改造中遇到DIV+CSS实现的table,新需求需要在表格使用单元格合并,网上调查返现CSS display:table实现的table表格,没有单元格的属性和样式,经过一番思考,曲折现实了单元格 ...

  6. vue mand-mobile按2.0文档默认安装的是1.6.8版本

    vue mand-mobile按2.0文档默认安装的是1.6.8版本 npm list mand-mobilebigbullmobile@1.0.0 E:\webcode\bigbullmobile` ...

  7. FTR-B3GA003Z-信号继电器

    IC名称:B3GA003Z 数据手册:链接:https://pan.baidu.com/s/1MNe-fcKNAnuXyRLxhfUhjA 密码:6mo2 芯片自拍照: 封装尺寸以及引脚说明: 信号电 ...

  8. vue计算属性和侦听器

    一.计算属性: main.js: var app = new Vue({ el: '#app', data: { math: 80, physics: 90, english: 30 }, compu ...

  9. 反向代理&集线器和交换机的区别&广播地址&seq与ack的区别

    反向代理服务器: 当一个代理服务器能够代理外部主机访问内部网络时,这种代理服务的方式称为反向代理服务,该服务器被称为反向代理服务器. 集线器与交换机的区别: 集线器和交换机都是起到端口转发的作用,不同 ...

  10. tomcat启动闪退问题

    tomcat的bin->setclasspath.bat文件中 将两个set加上,并且将if not “%JAVA_HOME%”放到%JRE_HOME%上面.