バイナリ形式のxmlファイルがあります。このファイルの一部の行に含まれるキーワードをC++コードで抽出します。たとえば、次のキーワード<GK-VECTORS>
を検索し、そのキーワードがファイル内に存在することがわかったとします。ここに私のC++コードです:バイナリ形式のxmlファイルでキーワードを見つける
#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"はどういう形になっていますか? XMLは、定義上、ASCII形式です。おそらく、ファイルがどのように見えるかの簡単な例を示すことができます。 – lurker
@lurkerここにそのファイルを追加するには? xmlファイルは実際にはxml形式のいくつかのFortranコードによって生成されますが、バイナリ= .trueを有効にします。 "write(unit、binary = .true)"の中にある – rnels12
@ rnels12バイナリファイルフォーマットを持っていて、 'getline()'を使ってそれを読み取っていますか? –