2

私が開発している小さなファイル形式の場合、519 バイトのヘッダーをファイルに出力する必要があります。私はストリームの概念全体に少し慣れていません。Truevision Targa ファイルのヘッダーを読んだ経験はありますが。しかし、出力は私がよく知っているものです。

基本的に、ここに私の問題があります。

ofstream のインスタンスを開き、次のようなヘッダーを出力する必要があります。

typedef struct header {
    char      version;   // offset 0, length 1
    short int width;     // offset 1, length 2
    short int height;    // offset 3, length 2
    short int pathlen;   // offset 5, length 2
    char      desc[512]; // offset 7, length 512
} fileHeader;

ここで、ファイルの最初の 519 バイトでこれらすべてを取得する必要があります。残りのコンテンツはさまざまです。このヘッダーをファイルにコピーするにはどうすればよいでしょうか?

できれば ofstream クラスを使用してこれを行いたいのですが、元の C ライブラリでも問題ありません。私はこれに 2 時間かかりましたが、まだどこにもたどり着いておらず、Google で検索しようとしてもあまり役に立ちません。

4

1 に答える 1

3
std::ofstream& operator<<(std::ofstream& out, const header& myheader) {
    out.write((char*)&myheader.version, sizeof(myheader.version));
    out.write((char*)&myheader.width, sizeof(myheader.width));
    out.write((char*)&myheader.height, sizeof(myheader.height));
    out.write((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    out.write((char*)&myheader.desc, sizeof(myheader.desc));
    return out;
}
std::ifstream& operator>>(std::ifstream& in, header& myheader) {
    in.read((char*)&myheader.version, sizeof(myheader.version));
    in.read((char*)&myheader.width, sizeof(myheader.width));
    in.read((char*)&myheader.height, sizeof(myheader.height));
    in.read((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    in.read((char*)&myheader.desc, sizeof(myheader.desc));
    return in;
}

int main() {
    std::cout << fileHeader << '\n';
    std::cin >> fileHeader;
    return 0;
}

ポインターがないので、かなり簡単です。(これは狭いストリームでのみ機能することに注意してください)
テキスト、および動的メモリ/ポインターなどを使用して物事を示す別の例

class thing {
    std::string name;
    int height;
    friend std::ofstream& operator<<(std::ofstream& out, const thing & myheader);
    friend std::ifstream& operator>>(std::ifstream& in, thing & myheader);
public: 
    thing() {}
};

std::ofstream& operator<<(std::ofstream& out, const thing & myheader) {
    thing << name.size() << ' ';
    thing.write(&name[0], name.size()) << ' ' << height;
} 
std::ifstream& operator>>(std::ifstream& in, thing & myheader) {
    int size;
    in >> size;
    myheader.name.resize(size);
    in.read(&myheader.name[0], name.size());
    return in >> myheader.height;        
} 
于 2011-10-28T22:13:38.267 に答える