在二进制格式的xml文件中查找关键字

finding keyword in an xml file with binary format

本文关键字:查找 关键字 文件 xml 二进制 格式      更新时间:2023-10-16

我有一个二进制格式的xml文件。我想用c++代码提取这个文件中某行中包含的一些关键字。假设我想找到以下关键字<GK-VECTORS>,并且我知道该关键字存在于文件中。这是我的c++代码:

#include <fstream>
#include <iostream>
using namespace std;    
int main(){
  int size(8);
  ifstream gfile("gkvectors.dat", ios::binary | ios::in);
  string keyword = "<GK-VECTORS>";
  string line;
  while( gfile.good() ){
    getline(gfile,line);
    bool found = line.find(keyword);
    if( found != string::npos ){
      cout << line << 'n';
      break;
    }
  }
  return 0;
}

我从执行这些文件中得到的输出是不可读的:

以下是(未格式化的)xml文件内部的样子:

^D^@^@^@^E^Z^@^@^D^@^@^@^^^@^@^@200^Z^@^@
<?iotk version="1.2.0"?>
^^^@^@^@^D^@^@^@^E^]^@^@^D^@^@^@!^@^@^@200^]^@^@
<?iotk file_version="1.0"?>
!^@^@^@^D^@^@^@^E^U^@^@^D^@^@^@^Y^@^@^@200^U^@^@
<?iotk binary="T"?>
^Y^@^@^@^D^@^@^@^E^X^@^@^D^@^@^@^^@^@^@200^X^@^@
<?iotk qe_syntax="F"?>
^^@^@^@^D^@^@^@^A^N^@^@^D^@^@^@^R^@^@^@200^N^@^@
<GK-VECTORS>
^R^@^@^@^D^@^@^@^A;^@^@^D^@^@^@?^@^@^@200;^@^@
  <NUMBER_OF_GK-VECTORS type="integer" size="1" kind="4">
?^@^@^@^H^@^@^@^@^@^@^@255^C^@^@^H^@^@^@^D^@^@^@^B^[^@^@^D^@^@^@^_^@^@^@200^[^@^@
  </NUMBER_OF_GK-VECTORS>
^_^@^@^@^D^@^@^@^A?^@^@^D^@^@^@C^@^@^@200?^@^@
  <MAX_NUMBER_OF_GK-VECTORS type="integer" size="1" kind="4">
C^@^@^@^H^@^@^@^@^@^@^@326^C^@^@^H^@^@^@^D^@^@^@^B^_^@^@^D^@^@^@#^@^@^@200^_^@^@
  </MAX_NUMBER_OF_GK-VECTORS>
#^@^@^@^D^@^@^@^A1^@^@^D^@^@^@5^@^@^@2001^@^@
  <GAMMA_ONLY type="logical" size="1" kind="4">
5^@^@^@^H^@^@^@^@^@^@^@^@^@^@^@^H^@^@^@^D^@^@^@^B^Q^@^@^D^@^@^@^U^@^@^@200^Q^@^@
  </GAMMA_ONLY>
^U^@^@^@^D^@^@^@^AC^@^@^D^@^@^@G^@^@^@200C^@^@
  <K-POINT_COORDS type="real" size="3" kind="8" UNITS="2 pi / a">
G^@^@^@^^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^^@^@^@^D^@^@^@^B^U^@^@^D^@^@^@^Y^@^@^@200^U^@^@
  </K-POINT_COORDS>
^Y^@^@^@^D^@^@^@^A.^@^@^D^@^@^@2^@^@^@200.^@^@
  <INDEX type="integer" size="941" kind="4">

有人能帮我解决这个问题吗?这样我就可以得到可读的输出了?

请查看XML规范,尤其是第2.6节"处理说明"。

PI不是文档字符数据的一部分,但必须传递给应用程序。

您必须将数据逐字逐句地传递给应用程序
如果您想查看数据,您应该以十六进制格式打印它,就像十六进制转储实用程序所做的那样。

此外,为了解释数据,您必须了解数据的布局。

由于它是应用程序数据,因此不能保证数据是可打印的。