0

私は C++ に比較的慣れていないので、独自のファイル形式を読み込もうとしています。ヘッダー形式を知ってRTIHeaderおり、必要なフィールドを含む構造体を作成しました。

私のテスト コードは、ファイルからバイトを読み取り、それらをヘッダー構造体と同じメモリ空間にコピーして、効果的に再構成します。私の問題は、テストコードを実行するたびに (コンストラクターを呼び出すだけで)、異なる値が得られることです! 私の理論では、私は完全には理解していませんmemcpy

struct RTIHeader decode(char* memblock){
    struct RTIHeader header;
    memcpy(&header,&memblock,sizeof(RTIHeader));
    return header;
}

RTIFile::RTIFile(const char* filename){
    // open the file in binary input mode with the pointer at the end
    std::ifstream file(filename,
                       std::ios::in |
                       std::ios::binary |
                       std::ios::ate);

    std::ifstream::pos_type size;
    char * memblock;
    RTIHeader header;

    // if the file didn't open, throw an error
    if(!file.is_open()){
        //TODO learn about C++ error handling
        return;
    }
    // use pointer position to determine file size
    size = file.tellg();
    // read file
    memblock = new char [sizeof(RTIHeader)];
    file.seekg(0,std::ios::beg);
    file.read(memblock,sizeof(RTIHeader));

    header = decode(memblock);

    std::cout << (unsigned int)header.signature[0] << "\n";

    // still need to read the rest of the file
    file.close();
}
4

1 に答える 1

2

の 2 番目の引数としてのアドレスを渡しています。は関数のパラメーターであるため、スタックからメモリのチャンクをコピーするだけです。memblockmemcpymemblock

修正するには、ポインターを直接渡すだけです。

memcpy(&header,memblock,sizeof(RTIHeader));

ちなみに、構造体を値で返すため、返された値が完全にコピーされるため、追加のmemcpy が発生します (コンパイラが最適化しない限り)。これを回避するには、次のように、ターゲット構造体を へのポインターとして渡すことを検討する必要がありますdecode

struct RTIHeader *decode(struct RTIHeader *header, char* memblock){
    memcpy(header, memblock, sizeof(RTIHeader));
    return header;
}

その後、あなたはただしなければなりません

decode(&header, memblock);

これはより効率的です。

于 2012-09-12T01:34:37.453 に答える