c++/c读取二进制文件

因项目需要读取二进制文件,一开始用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语言的代码来读取文件的可靠性更高。

猜你喜欢

转载自blog.csdn.net/sinat_34816302/article/details/86011884