2017-10-29 17 views
0

バイナリファイルの内容を構造体に読み込もうとしていますが、構造体の内容を出力するたびにかなり奇妙な出力が得られます。バイナリファイルから構造体を読み取ることができません

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| 

任意の助けいただければ幸いです - 私はしばらくの間、この機能に引っかかってきました。

+3

名前が始まる前にファイルに6バイトがあります。あなたはレイアウトが正しいと確信していますか?あなたが構造体を読み込もうとする前に6バイトを読んだり、探したりするとどうなりますか?あなたは 'structのポインタについて何かする必要があるでしょう。あなたはそれらを書くことができず、それらを読み込むことは全く役に立たないと期待しています。リストをたどり、各フィールドを個別に読み書きする必要があります。とにかくやるのが一番いいのです。 –

+6

ファイルは最初にどのように作成されましたか?また、 'コース'と '次の'フィールドは、ポインタであるため、それらを読み込んだ後は決して正しいとは限りません。 – Serge

+0

ファイルをどのように保存しますか? – BobRun

答えて

0

ファイルタイプに応じて、最初の数バイトは、ここでは、fileheaderことができる情報は、他の人が指摘したように動作しませんバージョン番号、データの長さなどのポインタについては

、同様に保存することができますポインターは実際の関連データではなくアドレスであるためです。

ファイルの読み込みを開始する前に、sizeof(fileheader)にfseekしたいとします。

また、構造体がCで埋め込まれており、構造体の要素を宣言した順序が、コンパイラが決定した順序ではないことに注意してください。

関連する問題