バイナリファイルの内容を構造体に読み込もうとしていますが、構造体の内容を出力するたびにかなり奇妙な出力が得られます。バイナリファイルから構造体を読み取ることができません
typedef enum _SEX {MALE = 'M', FEMALE = 'F', OTHER = 'O'} SEX;
は今、私の関数として次のとおりです。のように定義コースの構造体で
struct student {
char name[32];
unsigned int age;
SEX sex;
float gpa;
struct course *courses;
struct student *next;
}
:下記の構造体は、私が設定しようとしていているよう
struct course {
char grade;
unsigned int number;
struct course *next;
}
とSEX定義されました次のとおりです。
void read_bin(char *filename){
FILE *file;
struct student myStudent;
file = fopen(filename, "rb");
if(file == NULL){
printf("Unable to open file!");
return;
}
fread(&myStudent, sizeof(struct student), 1, file);
printf("\nName: %s, Age: %d", myStudent.name, myStudent.age);
fclose(file);
}
間違った番号にしても表示されない名前と年齢を設定すると0
:
年齢:この奇妙な出力を得ることに保ちます。私は、これが原因パディングになるかもしれないと思ったので、私は必要に応じて、それは個々の要素やパッドを読み取るように
fread(&myStudent.name, sizeof myStudent.name, 1, file);
fread(&myStudent.age, sizeof myStudent.age, 1, file);
を使用してみました。しかし、私は同じ出力を得る。私は私が扱った正確に何を見るために、hexdumpに対してを実行したときに、これが出てきたものです:
f0 0d 03 00 00 00 46 72 65 64 00 00 00 00 00 00 |......Fred......|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00 00 00 00 00 00 1d 00 00 00 4d 00 00 00 cd cc |..........M.....|
4c 40 01 00 00 00 44 02 00 00 41 4a 6f 65 00 00 |[email protected]|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00 00 00 00 00 00 00 00 00 00 00 16 00 00 00 4d |...............M|
00 00 00 33 33 73 40 03 00 00 00 6e 00 00 00 42 |[email protected]|
dc 00 00 00 41 54 01 00 00 41 53 61 72 61 68 00 |....AT...ASarah.|
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00 00 00 00 00 00 00 00 00 00 16 00 00 00 46 00 |..............F.|
00 00 00 00 40 40 03 00 00 00 78 00 00 00 42 dc |[email protected]@....x...B.|
00 00 00 41 4a 01 00 00 43 |...AJ...C|
任意の助けいただければ幸いです - 私はしばらくの間、この機能に引っかかってきました。
名前が始まる前にファイルに6バイトがあります。あなたはレイアウトが正しいと確信していますか?あなたが構造体を読み込もうとする前に6バイトを読んだり、探したりするとどうなりますか?あなたは 'structのポインタについて何かする必要があるでしょう。あなたはそれらを書くことができず、それらを読み込むことは全く役に立たないと期待しています。リストをたどり、各フィールドを個別に読み書きする必要があります。とにかくやるのが一番いいのです。 –
ファイルは最初にどのように作成されましたか?また、 'コース'と '次の'フィールドは、ポインタであるため、それらを読み込んだ後は決して正しいとは限りません。 – Serge
ファイルをどのように保存しますか? – BobRun