8.7 C++二进制文件读写操做

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

总结:ios

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

  对于文本文件而言,咱们只能用ofstream类定义对象用于输出到文件,用ifstream类定义对象用于从文件中输入,而对于二进制文件而言,除了能够这么作之外,咱们还能够用fstream类定义对象既能用于从文件输入,又能输出到文件中。函数

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

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

  有时咱们只须要获取某个指定位置的数据而已,此时若是须要将数据所有读入再找到对应位置数据实在是效率过低。为此系统为咱们提供了一些操做文件读写指针位置的成员函数,咱们可使用这些函数,将文件读写指针移动到指定位置并操做其中的数据。.net

 

函数 用途
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是存储空间的大小,也即须要读写的内容的字节数。有了这两个用于读写二进制文件的函数,咱们经过示例来看一下如何使用这两个函数。code


例1:htm

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int A[ 3 ][ 10 ] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 },
                         { 1, 2, 3, 4, 7, 7, 7, 7, 7, 7 },
                         { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 } };
    int B[ 3 ][ 10 ];
    int i, j;

    for( i = 0; i < 3; i++ )
    {
        for( j = 0 ; j < 10; 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( -1 );
    }

   output.write ((char *) A, sizeof( A ) );
    for( i = 0; i < 3; i++ )
    {
        for( j = 0 ; j < 10; 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( -1 );
    }

    input.read( ( char * ) & B , sizeof( B ) );
    for( i = 0; i < 3; i++ )
    {
        for( j = 0 ; j < 10; j++ )
        {
            //input.read ( ( char * ) & B[ i ][ j ], sizeof( B[ i ][ j ] ));
        }
    }

    for( i = 0; i < 3; i++ )
    {
        for( j = 0 ; j < 10; 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 0;
}

这个例子的主要功能就是先将一个二维数组以二进制的方式写入到一个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。

相关文章
相关标签/搜索