C++中的文件输入/输出(5):二进制文件的处理

C++入门 专栏收录该内容
15 篇文章 0 订阅

C++中的文件输入/输出(5)

原作:Ilia Yordanov,  loobian@cpp-home.com

 

二进制文件的处理

 

虽然有规则格式(formatted)的文本(到目前为止我所讨论的所有文件形式)非常有用,但有时候你需要用到无格式(unformatted)的文件——二进制文件。它们和你的可执行程序看起来一样,而与使用<<>>操作符创建的文件则大不相同。get()函数与put()函数则赋予你读/写无规则格式文件的能力:要读取一个字节,你可以使用get()函数;要写入一个字节,则使用put()函数。你应当回想起get()——我曾经使用过它。你可能会疑惑为什么当时我们使用它时,输出到屏幕的文件内容看起来是文本格式的?嗯,我猜这是因为我此前使用了<<>>操作符。

 

译注:作者的所谓“规则格式文本(formatted text)”即我们平时所说的文本格式,而与之相对的“无格式文件(unformatted files)”即以存储各类数据或可执行代码的非文本格式文件。通常后者需要读入内存,在二进制层次进行解析,而前者则可以直接由预定好的<<>>操作符进行读入/写出(当然,对后者也可以通过恰当地重载<<>>操作符实现同样的功能,但这已经不是本系列的讨论范围了)。

 

get()函数与都各带一个参数:一个char型变量(译注:指get()函数)或一个字符(译注:指put()函数,当然此字符也可以以char型变量提供)

假如你要读/写一整块的数据,那么你可以使用read()write()函数。它们的原型如下:

 

istream &read(char *buf, streamsize num);

ostream &write(const char *buf, streamsize num);

 

对于read()函数,buf应当是一个字符数组,由文件读出的数据将被保存在这儿。对于write()函数,buf是一个字符数组,它用以存放你要写入文件的数据。对于这两个函数,num是一个数字,它指定你要从文件中读取/写入的字节数。

假如在读取数据时,在你读取“num”个字节之前就已经到达了文件的末尾,那么你可以通过调用gcount()函数来了解实际所读出的字节数。此函数会返回最后一次进行的对无格式文件的读入操作所实际读取的字节数。

在给出示例代码之前,我要补充的是,如果你要以二进制方式对文件进行读/写,那么你应当将ios::binary作为打开模式加入到文件打开的参数表中。

现在就让我向你展示示例代码,你会看到它是如何运作的。

 

示例1:使用get( )put( )

 

#include <fstream.h>

 

void main()

{

    fstream File("test_file.txt",ios::out | ios::in | ios::binary);

 

    char ch;

    ch='o';

 

    File.put(ch); // ch的内容写入文件

 

    File.seekg(ios::beg); // 定位至文件首部

 

    File.get(ch); // 读出一个字符

 

    cout << ch << endl; // 将其显示在屏幕上

 

    File.close();

}

 

示例2:使用read( )write( )

 

#include <fstream.h>

#include <string.h>

 

void main()

{

    fstream File("test_file.txt",ios::out | ios::in | ios::binary);

 

    char arr[13];

    strcpy(arr,"Hello World!"); //Hello World!存入数组

 

    File.write(arr,5); // 将前5个字符——"Hello"写入文件

 

    File.seekg(ios::beg); // 定位至文件首部

 

    static char read_array[10]; // 在此我将打算读出些数据

 

    File.read(read_array,3); // 读出前三个字符——"Hel"

 

    cout << read_array << endl; // 将它们输出  

 

    File.close();

}

  • 0
    点赞
  • 2
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值