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