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

您将 的地址作为memblock的第二个参数传递memcpy。由于memblock是函数的参数,因此您只需从堆栈中复制内存块。

要修复,只需直接传递指针:

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 回答