因项目需要读取二进制文件,一开始用C++读取,c++下用的是ifstream类,完整代码如下:
string b3dmpath = "G:\\Application\\gisLibary\\3dtilesReader\\testdata\\BatchTableHierarchy\\tile.b3dm";
ifstream in(b3dmpath.c_str(), ios::in || ios::binary);//
in.seekg(0, ios::end );
size_t filesize = in.tellg();
in.seekg(ios::beg);
std::vector<char> gltfbuf(filesize);
in.read(gltfbuf.data(), filesize);
但读取结果 gltfbuf显示,前面一部分还正确,到vector后面的时候,字符全部变成了0,根本不正确,我又试了一下C语言来读取,结果正确,目前还不知道什么原因,如果有大神知道,希望能告诉我。C语言代码如下:
FILE *fid;
fid = fopen("G:\\Application\\gisLibary\\3dtilesReader\\testdata\\BatchTableHierarchy\\tile.b3dm", "rb");
if (fid == NULL)
{
printf("读取文件出错");
return 0;
}
fseek(fid, 0, SEEK_END);
long lSize = ftell(fid);
rewind(fid);
//开辟存储空间
char *pos = (char*)malloc(lSize);
if (pos == NULL)
{
printf("开辟空间出错");
return 0;
}
fread(pos, sizeof(char), lSize, fid);
fclose(fid);
for (int i = 0;i< lSize;i++)
{
printf("%c", *pos);
pos++;
}
//我想要的结果是最后9090 * 2个字符,所以对这部分字符操作验证了一下
vector<char> vpos;
vpos.reserve(9090 * 2);
for (int i=0;i< 9090 * 2;i++)
{
vpos.push_back(*pos);
pos--;
}
vector<unsigned short> index;
index.reserve(9090);
unsigned short tem = 0;
for (int m = 0; m < 9090; m++)
{
memcpy(&tem, &vpos.at(0) + 2*m, 2);
index.push_back(tem);
}
但我想用vector来保存读取的结果,而不是指针,所以参考了下面的文章
https://www.zhihu.com/question/52359180
其结果显示正确。不知道是编译器的问题还是我代码的问题,总之用C语言的代码来读取文件的可靠性更高。