参考: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 server 操作列

    新增一列 ) 修改列类型: ) 修改列的名称: EXEC sp_rename 'tableName.column1' , 'column2' (把表名为tableName的column1列名修改为co ...

  2. SqlServer父节点与子节点查询及递归

    在最近老是用到这个SQL,所以记下来了: 1:创建表 CREATE TABLE [dbo].[BD_Booklet]( [ObjID] [int] IDENTITY(1,1) NOT NULL, [P ...

  3. nginx配置详细解析

    转自 http://blog.csdn.net/zhongguozhichuang/article/details/528168871.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将 ...

  4. (Review cs231n) BN and Activation Function

    CNN网络的迁移学习(transfer learning) 1.在ImageNet上进行网络的预训练 2.将最上方的层,即分类器移除,然后将整个神经网络看成是固定特征提取器来训练,将这个特征提取器置于 ...

  5. LinkedList 利用的是尾插法

  6. haproxy 初识

    官方网站:http://www.haproxy.org 描述 HAProxy的是一个免费的,非常快速和可靠的解决方案,提供 高可用性, 负载均衡和代理对TCP和基于HTTP的应用程序.它特别适用于流量 ...

  7. 绘制COCO数据集结果

    import os import time import datetime import mmcv import cv2 as cv import json import numpy as np im ...

  8. 【2.0】SpringBoot2配置Druid数据源及监控

    什么是Druid? Druid首先是Java语言中最好的数据库连接池,也是阿里巴巴的开源项目.Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池, ...

  9. Learning-Python【8】:Python字符编码

    1.内存和硬盘都是用来存储的 内存:速度快 硬盘:永久保存 2.文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编写的 ...

  10. Anaconda环境下安装库

    使用anaconda环境下使用pycharm后,有些其他库也想安装,但开始在python.exe目录下安装没成功,因为pycharm用的环境已经不是原始的python.exe解释器了.就总结了一些安装 ...