1

.ASE ファイルを読み取るためのクラスがあり、変数をバイナリ ファイルに格納して、次回アプリケーションを実行するときに高速にアクセスできるようにする必要があります。書き込みプロセスを簡単にするために、情報を構造体に保存します。これは私が使用する構造体で、ヘッダーで定義されています。

struct myMesh{
    std::vector<Vector3> vertices;
    std::vector<Vector2> uvs;
    std::vector<Vector3> normals;
    int verticesSize;
    int uvsSize;
    int normalsSize;
};

変数を定義するために、ヘッダーにもこの構造体のインスタンスを作成しました。

myMesh myInfo;

構造体変数にデータを格納した後、C 関数を使用してバイナリ ファイルを作成します。

std::string path = filename + ".bin";
const char * c = path.c_str();

FILE *pBinaryFile;
pBinaryFile = fopen(c, "wb");
if (pBinaryFile==NULL){
    std::cout << "error";
}
fwrite(&myInfo.vertices, sizeof(myInfo), 1, pBinaryFile);
fclose(pBinaryFile);

バイナリが正しく作成されたかどうかをテストするために、ファイルを読み取り、構造体の別のインスタンスを作成してデータを視覚化します。

myMesh _myInfo;
FILE *theFile;
theFile = fopen(c, "rb");
if (theFile==NULL){
    std::cout << "error";
}
fread(&_myInfo, sizeof(_myInfo), 1, theFile);
fclose(theFile);

そして、これはうまくいきます。書き込みプロセスを使用せずに、ファイルを読み取ろうとすると問題が発生します。

/*FILE *pBinaryFile;
pBinaryFile = fopen(c, "wb");

if (pBinaryFile==NULL){
    std::cout << "error";
}

fwrite(&myInfo.vertices, sizeof(myInfo), 1, pBinaryFile);
fclose(pBinaryFile);*/


myMesh _myInfo;
FILE *theFile;
theFile = fopen(c, "rb");
if (theFile==NULL){
    std::cout << "error";
}
fread(&_myInfo, sizeof(_myInfo), 1, theFile);
fclose(theFile);

そして今、それは機能しません。struct の int 変数は正しく取得されますが、vector 変数は ??? の形式で表示されます。メモリエラーで。私は C++ にまったく慣れていないので、おそらくばかげた質問ですが、要点がわかりません。ofstream と ifstream の C++ 関数も試しましたが、同じ問題が発生します。

前もって感謝します。

4

5 に答える 5

1

問題は、これによって書き込みプロセスが簡単になるわけではなく、単に間違っていることです。

fwrite への 1 回の呼び出し (または同等の C++ を使用) を使用して、ベクトルのような複雑なオブジェクトを出力することはできません。あなたはそれを難し​​い方法でしなければなりません。

Vector2との定義がわからないので、具体的なアドバイスはできませんVector3。ただし、基本的には、ベクトルのサイズとそれに続く各要素を出力する必要があります。それらの要素自体が複雑なオブジェクトである場合は、それらも特別に処理する必要があります。入力時に逆を行います。

于 2013-04-20T13:36:52.497 に答える
1

保存しているデータは基本的なネイティブ型ではないため、サイズを要求して構造を保存することはできません。構造体の各要素を読み書きするカスタムのシリアル化関数を作成する必要があります。

ベクトルの長さと Vector3/Vector2 などの単位要素のサイズを取得して std::vector を保存し、保存します。

また、ファイルの作成と読み取りに C 関数を使用していることに気付きました。これはとてもクールではありません。C++ を使用http://www.cplusplus.com/doc/tutorial/files/を参照

お役に立てれば。

于 2013-04-20T13:39:35.307 に答える
1

std::vector はヒープにスペースを割り当て、ベクター オブジェクト自体のポインターのみを保持します。

それはあなたが言うようなものです:

Type* array = new Type[10];  // array's value is a memory address, NOT the array itself

ベクトルをファイルに出力すると、実際にはアドレスが出力されます。同じ実行で保存と読み込みを実行しても失敗しなかったのはそのためです。アドレスは変更されていないため、離れた場所から取得するだけです。ただし、ベクトルを設定して前に保存しないと、既に保存されているアドレスは何も指さず、不正なメモリ アクセスにつながります。

ベクトルを正当に保存するには、最初にベクトルのサイズを保存してから、反復してすべての要素を保存するか、Boost Serializationを使用します。

于 2013-04-20T13:46:44.210 に答える
0

ベクトルは、ベクトル オブジェクト自体にデータを保持しません。ヒープに割り当てられた個別のメモリへのポインターを保持します。ポインタを保存して復元していますが、ベクトル内のポイント先のデータについては何もしていません。ブースト シリアライゼーション ライブラリのチュートリアルを読むことをお勧めします。

于 2013-04-20T13:39:16.850 に答える