参考: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. 中文WebFont解决方案Font-Spider(字蛛)

    我们在日常需求中,经常会碰到视觉设计师对某个中文字体效果非常坚持的情况,因为页面是否高大上,字体选择是很重要的一个因素,选择合适的字体可以让页面更优雅.面对这种问题,我们通常以下方式来进行设计还原: ...

  2. SV class

    SV中的class通过new来创建实例,new函数可以传递多个参数: packet P1:  P1 = new:创建一个P1的对象: P2 = P1:P2也指向同一个对象: P2 = new P1:P ...

  3. Feign 与 Hystrix

    Feign 与 Hystrix Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud 整合了Ribbon和Eureka,从而为我们 ...

  4. HP Jack介绍

    转载:https://www.cnblogs.com/Peter-Chen/p/3999212.html 目前市场上耳机分为4环耳机(图1所示,iphone型)和3环耳机(图2所示).4环耳机称为he ...

  5. javascript:void(0) 和 href="#"的区别

    <a href="javascript:void(0);">点击 <a href="#">点击 如果使用下面一种方式,会跳到网页顶部. ...

  6. 日期计算、正则、sequence、索引、表连接、mybatis

    ************************** mybatis ******************************************* #{} 的参数替换是发生在 DBMS 中, ...

  7. GoldenGate for Java Adapter介绍一(原理篇)

    前言 Oracle Goldengate在很早前就推出了一个for java的版本,主要目的是方便把关系型数据实时写入到不支持的目标端,如JMS或Redis等key value数据库.在Hadoop刚 ...

  8. Centos7.4配置虚拟环境

    environment Centos7.4 Python3.7 download pip isntall virtualenv create environment virtualenv enviro ...

  9. 安卓内嵌H5只展示部分静态页面

    问题: 安卓内嵌H5在华为P9部分机型只展示h5静态页面无法展示接口返回渲染的页面 解决办法: Android  关闭硬件加速   android:hardwareAccelerated=" ...

  10. android to hide the keybord

    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hi ...