1

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

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

全部在一条线上。

我想获取这个二进制文件并使用函数输出一个可读的文本fstream文件read/ 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主意struct?有人告诉我,二进制文件遵循 的模式struct,一个 25 个字符的名称和 3 个 int 测验成绩,共有 5 个学生。

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

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

巴特辛普森, 16640, 17920, 1818317312

ph 威格姆, 2883584, 1766588416, 1394631027

英普森, 1291845632, 1769239137, 1917853806

因斯, 1751935309, 1702065519, 1851872800

豪顿, 0, 0, 0

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

什么时候应该看起来像:

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

巴特辛普森, 75, 65, 70

拉尔夫·维格姆,35、60、44 岁

丽莎辛普森,100 岁、98 岁、91 岁

马丁普林斯, 99, 98, 99

米尔豪斯·范豪顿,80、87、79

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

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

我的问题是如何将该数据转换为可读的文本格式,如果数据似乎遵循与我的结构完全相同的模式,为什么名称会被截断?请帮忙!

4

1 回答 1

0

https://gist.github.com/anonymous/5237202 这就是我的做法,我评论了代码,希望它对你有所帮助。1. 以这种方式读取二进制文件没有任何问题 2. 像任何其他变量一样制作结构数组是完全可以的。

是的,二进制遵循结构的模式,名称为examOnePointsexamTwoPointsexamThreePoints,但由于名称具有不同的长度,因此您不能将二进制文件中的所有值都扔到结构开始和以后的内存位置。

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

于 2013-03-25T13:56:30.970 回答