我有一个文件'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
的{{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个字节相关。
我的问题是如何将数据转换为可读的文本格式,如果数据看起来像我的结构一样遵循确切的模式,为什么名称会被切断?请帮忙!
答案 0 :(得分:0)
https://gist.github.com/anonymous/5237202 我就是这样做的,我评论了代码,希望它能以某种方式帮助你。 以这种方式读二进制没什么错 2.制作struct数组非常好,就像使用任何其他变量一样。
是的,二进制跟随struct的结构,名称examOnePoints examTwoPoints examThreePoints,但由于名称有不同的长度,你不能只将二进制文件中的所有值都抛出到struct开始和之后的内存位置。
此外,我使用3个整数的数组来存储检查点而不是3个单独的变量,因为它更容易编码,它可以以任何一种方式完成。还有一件事,我建议你下载一些免费的hexeditor并检查一下.dat文件,它会帮助你理解为什么我会这样读点。