如何将此二进制(.dat)文件[内部示例]转换为可读文本

时间:2013-03-24 22:34:12

标签: filter binary ascii fstream ofstream

我有一个文件'quizzes.dat',当在记事本中打开时看起来像这样:

 "Bart Simpson K A F Ralph Wiggum # < , Lisa Simpson d b [ Martin Prince c b c Milhouse Van Houten P W O "

全部在一条线上。

我想使用fstreamread/ write函数获取此二进制文件并输出可读文本文件。

到目前为止我的代码非常简单:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool openInFile (ifstream &, char []);
bool openOutFile (ofstream &, char []);

struct student
{
char name[25];
int exam1;
int exam2;
int exam3;
};

student bclass[5];

int main()
{

ifstream input;
openInFile (input, "quizzes.dat");

ofstream output;
openOutFile (output, "quizzes.txt");

output << "=================================================\n";


while (!input.eof())
{
    for (int i = 0; i < 5; i++)
    {
    input.read((char*)&bclass[i], sizeof(bclass[i]));

    output << bclass[i].name << ", " << bclass[i].exam1 << ", "
           << bclass[i].exam2 << ", " << bclass[i].exam3 << endl;

    }
}

output << "=================================================\n";



input.close();
output.close();

return 0;
}

// Opens and checks input file
bool openInFile (ifstream &in, char filename[])
{
in.open(filename, ios::in | ios::binary);

if (in.fail())
{
    cout << "ERROR: Cannot open quizzes.dat\n";
    exit(0);
}
return in.fail();
}

// Opens and checks output file
bool openOutFile (ofstream &out, char filename[])
{
out.open(filename, ios::out);

if (out.fail())
{
    cout << "ERROR: Cannot open quizzes.txt\n";
    exit(0);
}
return out.fail();
}

首先,这是读取二进制文件的最佳方法吗?或者array的{​​{1}}不是一个好主意吗?我被告知二进制文件遵循struct的模式,一个25个字符的名称,以及3个int测验成绩,共有5个学生。

最后,我在文本文件中得到的输出是:

=============================================== ==

Bart Simpson,16640,17920,1818317312

ph Wiggum,2883584,1766588416,1394631027

impson,1291845632,1769239137,1917853806

ince,1751935309,1702065519,1851872800

Houten,0,0,0

=============================================== ==

它应该看起来像:

=============================================== ==

Bart Simpson,75,65,70

Ralpph Wiggum,35岁,60岁,44岁

Lisa Simpson,100,98,91

Martin Prince,99,98,99

Milhouse Van Houten,80,87,79

=============================================== ==

在分析记事本中的dat文件时,我看到每个名称都分配了25个空格,并且不可读的部分每个都有4个空格,我认为这些空格与整数类型的4个字节相关。

我的问题是如何将数据转换为可读的文本格式,如果数据看起来像我的结构一样遵循确切的模式,为什么名称会被切断?请帮忙!

1 个答案:

答案 0 :(得分:0)

https://gist.github.com/anonymous/5237202 我就是这样做的,我评论了代码,希望它能以某种方式帮助你。 以这种方式读二进制没什么错 2.制作struct数组非常好,就像使用任何其他变量一样。

是的,二进制跟随struct的结构,名称examOnePoints examTwoPoints examThreePoints,但由于名称有不同的长度,你不能只将二进制文件中的所有值都抛出到struct开始和之后的内存位置。

此外,我使用3个整数的数组来存储检查点而不是3个单独的变量,因为它更容易编码,它可以以任何一种方式完成。还有一件事,我建议你下载一些免费的hexeditor并检查一下.dat文件,它会帮助你理解为什么我会这样读点。