我有一个二进制数据文件,其中包含 2d 和 3d 坐标,顺序如下:
uint32 numberOfUVvectors;
2Dvec uv[numberOfUVvectors];
uint32 numberOfPositionVectors;
3Dvec position[numberOfPositionVectors];
uint32 numberOfNormalVectors;
3Dvec normal[numberOfNormalVectors];
2Dvec 和 3Dvec 是分别由 2 个和 3 个浮点数组成的结构。
起初,我使用“通常”的方式读取所有这些值:
in.read(reinterpret_cast<char *>(&num2d), sizeof(uint32));
2Dvectors.reserve(num2d); // It's for an std::vector<2DVec> 2Dvectors();
for (int i = 0; i < num2d; i++){
2Dvec 2Dvector;
in.read(reinterpret_cast<char *>(&2Dvector), sizeof(2DVec));
2Dvectors.push_back(2Dvector);
}
它工作得很好,但是速度很慢(一个文件中可能有超过 200k 的条目,并且有这么多的读取调用,硬盘访问成为一个瓶颈)。我决定一次将整个文件读入缓冲区:
in.seekg (0, in.end);
int length = in.tellg();
in.seekg (0, in.beg);
char * buffer = new char [length];
is.read (buffer,length);
现在读取速度更快了,但问题是:如何将该 char 缓冲区解析回整数和结构?