binary file の header 読み書き

http://d.hatena.ne.jp/janus_wel/20100216/1266347871 でいってた header / footer を持った binary file の読み書きの header 部分をこんな方向でやる的な指針作りとしてちょいと書いてみた。まず header を扱うための構造体の定義と流し込むための << 演算子の overload から。 friend 指定は構造体定義の中に operator <<() 関数をまとめたいがために ( data の扱い方はその data 自身が知っているべきというきわめて oo 的な理由とあと単純にその方が定義が散らばらないので読みやすい ) 書いてるけど source の見通しが悪くならないなら global 関数として分離してもいいかも ( header 用構造体に read() / write() という member 関数を定義してそれを呼び出すとかするとキレイかな ) 。

// header.h

#include <istream>
#include <ostream>

// refer: http://www.geocities.jp/KY_webid/cpp/language/024.html#use_template_func
template<typename T> inline T constpointer_cast(const void* const p) {
    return static_cast<T>(p);
}
template<typename T> inline T pointer_cast(void* const p) {
    return static_cast<T>(p);
}

struct Header {
    char type[4];
    __int32 size;

    friend std::istream& operator >> (std::istream& in, Header& header) {
        in.read(header.type, 4);
        in.read(pointer_cast<char*>(&(header.size)), sizeof(header.size));
        return in;
    };

    friend std::ostream& operator << (std::ostream& out, const Header& header) {
        out.write(header.type, 4);
        out.write(constpointer_cast<const char*>(&(header.size)Content-Type: application/x-www-form-urlencoded
Content-Length: 7132