2016-08-24 25 views
0

バイナリファイルのデータを読み込もうとしていますが、悲しいことにC++で開かれているデータは、バイトモードであるため、pythonとは大きく異なります。それはC + +はそれを持っていないようです。バイナリファイルをC++のバイトモードで読むことができません

for (auto p = directory_iterator(path); p != directory_iterator(); p++) { 
    if (!is_directory(p->path())) 
     byte tmpdata; 
     std::ifstream tmpreader; 
     tmpreader.open(desfile, std::ios_base::binary); 
     int currentByte = tmpreader.get(); 
     while (currentByte >= 0) 
     { 
      //std::cout << "Does this get Called?" << std::endl; 
      int currentByte = tmpreader.get(); 
      tmpdata = currentByte; 
     } 
     tmpreader.close() 
    } 
else 
{ 
    continue; 
} 

私は基本的に'rb'モードでファイルを開くのPythonのメソッドのクローンをしたいです。すべての内容の実際のバイトデータを持つことができます(これはC++でも印刷できない文字があるため読み込みできませんが、DLL内でフィードする必要があるzlib圧縮データが含まれているため、しかしfopenが減価償却される

file_object = open('[file here]', 'rb') 

は、これに上記のC++コードを交換しても役立つことが判明したが、私は気にしない:それはすべてを解凍する

を私はPythonで、私はこのような何かを行うことができますことを知っています。

上記のコードでは、バッファデータから読み取っていなかったため、作業ができませんでした。私は後で、fopenfseekfreadfcloseが私が読取りバイトモード( 'rb')に必要な機能であることを理解しました。

for (auto p = directory_iterator(path); p != directory_iterator(); p++) { 
    if (!is_directory(p->path())) 
    { 
     std::string desfile = p->path().filename().string(); 
     byte tmpdata; 
     unsigned char* data2; 
     FILE *fp = fopen("data.d", "rb"); 
     fseek(fp, 0, SEEK_END); // GO TO END OF FILE 
     size_t size = ftell(fp); 
     fseek(fp, 0, SEEK_SET); // GO BACK TO START 
     data2 = new unsigned char[size]; 
     tmpdata = fread(data2, 1, size, fp); 
     fclose(fp); 
    } 
else 
{ 
    continue; 
} 
+1

投稿したコードの問題点は何ですか? – Martin

+0

それは私が欲しいものを正確にはしません、例えば、間違ったものを取得し、それはまったくファイルからデータを全く得ていないようです。 – PSXGamerPro1

+2

問題文が単純に「動作しない」場合は、ソリューションを提供することは困難です。実際の結果とどのように違うのか、そしてどのようなことが起こるのかをより完全に説明するために質問を編集してください。何が良い説明になるかについてのヒントについては、[ask]を参照してください。 –

答えて

5
int currentByte = tmpreader.get(); 
while (currentByte >= 0) 
{ 
    //std::cout << "Does this get Called?" << std::endl; 
    int currentByte = tmpreader.get(); 
    //^ here! 

あなたは外側のものを隠して第二の変数を宣言しています。しかし、この内部変数はwhileループの本体内でのみ有効であるため、while条件は変更されていない外部変数をチェックします。むしろこのようにしてください:

int currentByte; 
while ((currentByte = tmpreader.get()) >= 0) 
{ 
関連する問題