Windows 将数据映射到为整个文件分配的字节缓冲区的偏移量,而不是从文件本身读取数据

Windows 将数据映射到为整个文件分配的字节缓冲区的偏移量,而不是从文件本身读取数据,windows,visual-c++,memory,file-io,Windows,Visual C++,Memory,File Io,简而言之,我只是从二进制文件中读取并渲染它们 最初,我是通过单独读取文件中的每个片段,并按照文件中的说法为每个“块”动态分配内存来实现这一点的。我意识到这是低效的,所以我决定只分配一个缓冲区,将整个文件写入其中,然后专门将数据指针(即各种C结构的缓冲区)映射到它 最后,我发现了一个奇怪的不一致性,同时比较了使用一种方法与使用另一种方法对文件特定段的结果——尤其是部分(不一致性在visdata的实际位集成员中发现) 到底是什么不一致?嗯 据我所知,这只在前五个字节内。这之后的一切都应该是一致的

简而言之,我只是从二进制文件中读取并渲染它们

最初,我是通过单独读取文件中的每个片段,并按照文件中的说法为每个“块”动态分配内存来实现这一点的。我意识到这是低效的,所以我决定只分配一个缓冲区,将整个文件写入其中,然后专门将数据指针(即各种C结构的缓冲区)映射到它

最后,我发现了一个奇怪的不一致性,同时比较了使用一种方法与使用另一种方法对文件特定段的结果——尤其是部分(不一致性在visdata的实际
位集
成员中发现)

到底是什么不一致?嗯

据我所知,这只在前五个字节内。这之后的一切都应该是一致的

以下是该部分的布局:

struct bspVisdata_t
{
    int     numVectors;
    int     sizeVector;

    byte*   bitsets; //<-- data being compared
};

mapBuffer
定义如下

fseek( file, 0, SEEK_END );
size_t fsize = ftell( file );
mapBuffer = new byte[ fsize ](); // Zero-initialize memory
fseek( file, 0, SEEK_SET );
fread( mapBuffer, 1, fsize, file );

带有紧跟其后的
标题

memcpy(&header,mapBuffer,sizeof(bspHeader_t))

我做了很多重复检查,并做了许多不同的尝试来揭示为什么会发生这种情况,但我不明白。有没有人能解释为什么会发生这种情况?我觉得这是我缺少的东西,它更基本,超出了代码本身的范围


我可以验证这两种方法是否都有效,因为贴图在进行更改后呈现出了应有的效果。归根结底,它不是一个表演的障碍,但最好知道为什么…

你是否有机会以文本模式打开文件?不,这里是实际的一行:
file*file=fopen(filepath.c_str(),“rb”)
fseek( file, 0, SEEK_END );
size_t fsize = ftell( file );
mapBuffer = new byte[ fsize ](); // Zero-initialize memory
fseek( file, 0, SEEK_SET );
fread( mapBuffer, 1, fsize, file );