2012-03-18 1 views
0
struct ID3v2_header{ 
    char tag[3]; 
    char ver[2]; 
    char flag; 
    int size; 
}; 


ID3v2_header readID3v2_head(string file){ 
    char buf[10]; 
    ifstream infile(file.c_str(),ios::binary); 
    ID3v2_header head; 
    if(!infile || !infile.read(buf, 10)){ 
    cout<<"FAIL"<<endl; 
    infile.close(); 
    return head; 
    } 
    memcpy(&head,buf,10); 
    infile.close(); 
    return head; 

    } 

サイズを出力してから実行するたびに変更されるので、どこかオーバーフローしていますか?整数は、実行ごとに異なるファイルから読み込み、なぜですか?

+0

彼が言ったこと。また、同じ設定で同じコンパイラを使用して、同じ構造体から書かれたファイルですか? –

+1

あなたは戻って[あなたの他の質問](http://stackoverflow.com/questions/9696308/why-is-the-size-of-this-struct-12-and-not-10)への回答を読んでください。 。 – Blastfurnace

答えて

3

sizeof(ID3v2_header) == 10という前提を確認する必要があります。

memcpyを使用するのではなく、手動で構造体のフィールドに入力する必要があります。

+0

sizeofの結果は12ですが、バイトアライメントのためだと思いました。 http://stackoverflow.com/questions/9696308/why-is-the-size-of-this-struct-12-and-not-10 – carboncomputed

+0

それは正しいです。残念ながら、整列はフィールド 'size'の前に発生します(オフセット6になっているため、オフセット8にプッシュされる可能性が高くなります)。 – vhallac

+0

私はそれぞれのフィールドを手作業で行けば問題を解決できるだろうと私は理解していると思いますか? – carboncomputed

0

ファイルはバイトのストリームです。ファイルにデータを書き込む前に、既知の形式のバイトストリームに変換する必要があります。そのデータをファイルから読み戻すときは、そのバイトストリームの形式からメモリ内の構造体の形式に変換する必要があります。

memcpy(&head,buf,10); 

headは、メモリ形式であり、bufは、ファイル形式であるため、これは動作しません。これら2つの異なるフォーマット間で変換するには、いくつかのコードが必要です。

関連する問題