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 "

すべて1行で。

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か?バイナリファイルは、struct25文字の名前、3つのintクイズの成績、合計5人の生徒のパターンに従っていると言われました。

最後に、テキストファイルで取得する出力は次のとおりです。

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

バートシンプソン、16640、17920、1818317312

ph Wiggum、2883584、1766588416、1394631027

インプソン、1291845632、1769239137、1917853806

ince、1751935309、1702065519、1851872800

法天、0、0、0

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

次のようになります。

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

バートシンプソン、75、65、70

Ralpph Wiggum、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。他の変数と同様に、構造体の配列を作成することはまったく問題ありません。

はい、バイナリは構造体のパターンに従います。名前はexamOnePoints ExamTwoPoints ExamThreePointsですが、名前の長さが異なるため、バイナリファイルのすべての値を構造体の開始以降のメモリ位置にスローすることはできません。

また、コーディングが簡単だったため、3つの個別の変数ではなく、3つの整数の配列を使用して試験ポイントを格納しました。どちらの方法でも実行できます。もう1つ、無料のhexeditorをダウンロードして、.datファイルを少し調べることをお勧めします。これは、なぜ私がそのようにポイントを読んだのかを理解するのに役立ちます。

于 2013-03-25T13:56:30.970 に答える