そのため、バイナリ ファイルを自分の構造に正しく読み込めないという問題が少しあります。構造は次のとおりです。
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
37 バイトです (char 配列から 25 バイト、整数ごとに 4 バイト)。私の .dat ファイルは 185 バイトです。3 つの整数の成績を持つ 5 人の学生です。したがって、各学生は 37 バイト (37*5=185) を使用します。
プレーンテキスト形式では次のようになります。
Bart Simpson 75 65 70
Ralph Wiggum 35 60 44
Lisa Simpson 100 98 91
Martin Prince 99 98 99
Milhouse Van Houten 80 87 79
次のコードを使用して、各レコードを個別に読み取ることができます。
Student stud;
fstream file;
file.open("quizzes.dat", ios::in | ios::out | ios::binary);
if (file.fail())
{
cout << "ERROR: Cannot open the file..." << endl;
exit(0);
}
file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
while(!file.eof())
{
cout << left
<< setw(25) << stud.name
<< setw(5) << stud.quiz1
<< setw(5) << stud.quiz2
<< setw(5) << stud.quiz3
<< endl;
// Reading the next record
file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
}
そして、見栄えの良い出力が得られますが、一度に各構造の個々のメンバーだけでなく、一度に 1 つの構造全体を読み取れるようにしたいと考えています。このコードは、タスクを達成するために必要であると私が信じているものですが、... 機能しません (その後に出力を表示します):
※ファイルの開き方や構造宣言等、類似部分は除きます。
file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
while(!file.eof())
{
cout << left
<< setw(25) << stud.name
<< setw(5) << stud.quiz1
<< setw(5) << stud.quiz2
<< setw(5) << stud.quiz3
<< endl;
file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
}
出力:
Bart Simpson 16640179201818317312
ph Wiggum 288358417665884161394631027
impson 129184563217692391371917853806
ince 175193530917020655191851872800
それが台無しにしない唯一の部分は最初の名前です。その後、それは丘を下っています..私はすべてを試しましたが、何が悪いのかわかりません. 手元にある本も探しましたが、見つかりませんでした。そこにあるものは私が持っているもののように見え、機能しますが、何らかの奇妙な理由で私のものは機能しません。バイト 25 で file.get(ch) (ch は char) を実行すると、75 の ASCII である K が返されました。これは最初のテスト スコアです。私の構造を正しく読み取っていないだけです。
どんな助けでも大歓迎です、私はこれで立ち往生しています。
編集: 皆さんから予想外で素晴らしいインプットを大量に受け取った後、私は皆さんのアドバイスを受けて、一度に 1 人のメンバーを読むことに固執することにしました. 関数を使用して、物事をよりきれいに、より小さくしました。 このような迅速かつ啓発的な情報を提供していただき、重ねてお礼申し上げます。とても感謝しています。
ほとんどの人が推奨していない回避策に興味がある場合は、一番下までスクロールして、user1654209 による 3 番目の回答を見つけてください。この回避策は問題なく機能しますが、すべてのコメントを読んで、それが支持されない理由を確認してください。