2

私は、3D エンジンに必要なすべての画像を 1 つのファイルに入れる小さなプログラムに取り組んできましたが、fstream を使用してファイルに書き込もうとすると、理由は不明ですが、エラーは返されませんが、まだ何も書いていません。

たとえば、新しいファイルを初期化する単純な関数があります。

void initPAK(fstream& pakfile, image firstImg)
{
    PAKheader head;
    head.sign[0]    = 'P';
    head.sign[1]    = 'A';
    head.sign[2]    = 'K';
    head.nbdata     = 1;
    head.index.push_back(sizeof(head.sign)+sizeof(head.nbdata)+sizeof(uint32_t));

    if(pakfile.is_open())
    {
        pakfile.write(head.sign, sizeof(head.sign));
        pakfile.write((char*)&head.nbdata, sizeof(head.nbdata));
        for(uint32_t n=0; n<head.index.size(); n++)
        {
            pakfile.write((char*)&head.index[n], sizeof(head.index[n]));
        }

        pakfile.write((char*)&firstImg.width, sizeof(firstImg.width));
        pakfile.write((char*)&firstImg.height, sizeof(firstImg.height));
        pakfile.write((char*)&firstImg.channels, sizeof(firstImg.channels));
        for(uint32_t n=0; n<firstImg.data.size(); n++)
        {
            pakfile.write((char*)&firstImg.data[n], sizeof(firstImg.data[n]));
        }

    }
    else
    {
        cerr << "unable to open" << endl;
    }   
}

そして、私はそれを次のように使用します:

    fstream fileop;
    fileop.open("bin_file", fstream::in | fstream::out | fstream::trunc | fstream::binary);

    unsigned char zdata[] = {
        255, 0, 0,
        0, 255, 0,
        0, 0, 255,
    };

    image zimg;
    zimg.width = 3;
    zimg.height = 1;
    zimg.channels = 3;
    for(int i=0; i < 9; i++)
    {
        zimg.data.push_back(zdata[i]);
    }

    initPAK(fileop, zimg);

    fileop.close();

しかし、ファイル「bin_file」は、書き込みも作成もされませんでした。他のスタックオーバーフローの質問で、flush() を使用する必要があることを見ましたが、どちらも機能しませんでした。最も奇妙なことは、ofstream を fstream に置き換えるまで、この関数が機能していたことです。私は何を間違っていますか?

4

1 に答える 1

0

まあ、私は少し愚かです。この関数は機能します。私のプログラムは非常に面倒で、関数が呼び出されることはありませんでした... とにかく、コードを少しクリーンアップするのに役立つコメントに感謝します。

得られた教訓: 急いでコードを書いてはいけません。

于 2012-12-24T12:39:01.990 に答える