当前位置:C++技术网 > 资讯 > 二进制文件的小析

二进制文件的小析

更新时间:2018-12-19 15:11:05浏览次数:1+次

    文件操作时,如果不显示指定打开模式,文件流类将使用默认值。在<fstream> 中定义了如下打开模式和文件属性:
ios::app // 从后面添加
ios::ate // 打开并找到文件尾
ios::binary // 二进制模式I/O(与文本模式相对)
ios::in // 只读打开
ios::out // 写打开
ios::trunc // 将文件截为 0 长度

    可以使用位操作符 OR 组合这些标志,比如:

ofstream logFile("log.dat", ios::binary | ios::app);

    首先你要注意我们不再使用插入和提取操作符(<< 和 >> 操作符). 你可以这么做,但它不会用二进制方式读写。你必须使用read() 和write() 方法读取和写入二进制文件. 创建一个二进制文件, 看下一行。

ofstream fout("file.dat", ios::binary);

    这会以二进制方式打开文件, 而不是默认的ASCII模式。首先从写入文件开始。函数write() 有两个参数。 第一个是指向对象的

char类型的指针, 第二个是对象的大小(字节数)。 为了说明,看例子。

int number = 30; 
fout.write((char *)(&number), sizeof(number));

    第一个参数写做"(char *)(&number)". 这是把一个整型变量转为char *指针。如果你不理解,可以立刻翻阅C++的书籍,如果有

必要的话。第二个参数写作"sizeof(number)". sizeof() 返回对象大小的字节数. 就是这样!

    二进制文件最好的地方是可以在一行把一个结构写入文件。 如果说,你的结构有12个不同的成员。 用ASCII?文件,你不得不每次一条的写入所有成员。 但二进制文件替你做好了。 看这个:
struct OBJECT
 { 
    int number; 
    char letter;
 } obj;
obj.number = 15;
obj.letter = ‘M’; 
fout.write((char *)(&obj), sizeof(obj));

    这样就写入了整个结构! 接下来是输入. 输入也很简单,因为read()函数的参数和 write()是完全一样的, 使用方法也相同。

ifstream fin("file.dat", ios::binary);
fin.read((char *)(&obj), sizeof(obj));

我们看个程序:

#include "stdafx.h"
#include "string"
#include <fstream>
using namespace std;
class C
{
public:
    C():i(),str(){};//初始化,非赋值
    C(int iP,string strP):i(iP),str(strP){};
private:
    int i;
    string str;
};

void main()
{
    char *filePath = "D:/123.data";
    ofstream fout;
    fout.open(filePath,ofstream::binary);
    int n = 100;
    fout.write((char *)&n,sizeof(n));//读写都要做这样的转换(char *)&n
    C cOut(1,"ok");
    fout.write((char *)&cOut,sizeof(C));
    fout.close();

    ifstream fin;
    fin.open(filePath,ifstream::binary);
    int m = 0;
    fin.read((char *)&m,sizeof(int));
    C cIn;
    fin.read((char *)&cIn,sizeof(C));
    fin.close();
}