2016-05-04 11 views
-1

最近C++でIOに入ってきました。私は、バイナリファイルストリームから文字列を読み込もうとしています。バイナリからC++でカスタム文字列を再帰的に読み取る方法

カスタムタイプは次のように保存されます。

文字列は、文字列の長さが付いています。だからこんにちは、このように格納されます:6Hello \ 0。

私は基本的にバイナリファイルのテーブル(この場合は名前テーブル)からテキストを読み込みます。ファイルのヘッダーは、このテーブル(この場合は112バイト)と名前の数(318)のオフセットを教えてくれます。

この情報を使用して、このオフセットで最初のバイトを読み取ることができます。文字列の長さがわかります(例:6)。だから私は次のバイトから始まり、さらに5つを読んで、完全な文字列 "Hello"を取得します。これはオフセットのファーストネームでうまくいくようです。再帰的に残りの部分を読み込もうとすると、本当にたくさんのゴミが出ます。私はループと再帰関数を使用しようとしましたが、うまくいきません。問題が何であるかわからないので、元の1つの名前の取得方法に戻ります。コードは次のとおりです。

int printName(fstream& fileObj, __int8 buff, DWORD offset, int& iteration){ 
    fileObj.seekg(offset); 
    fileObj.read((char*)&buff, sizeof(char)); 
    int nameSize = (int)buff; 

    char* szName = new char[nameSize]; 
    for(int i=1; i <= nameSize; i++){ 
     fileObj.seekg(offset+i); 
     fileObj.read((char*)&szName[i-1], sizeof(char)); 
    } 
    cout << szName << endl; 
    return 0; 
} 

ドジ出力を作成せずに318の名前をすべて反復する方法はありますか? これを見ていただきありがとうございます、あなたの助けに感謝します。

+3

未使用と無意味なパラメータを削除し、私はこのような何か、この関数を書くのでしょうか?単純なループは正常に動作します。 –

+0

@πάνταῥεῖ私は別のループの中でそれを入れ子にしてみましたが、出力はそうではありません。最初の文字列の後のすべての文字列は毎回ガベージとランダムです。 – UnWorld

+1

よく分かりませんが、デバッガであなたのコードを調べて、見つからなかったものを見つけてください。 –

答えて

3

少し複雑すぎます。次のシーケンシャルリードを探す必要はありません。あなたがそれを行うために再帰を使用したいのはなぜ

void printName(fstream& fileObj, DWORD offset) { 
    char size = 0; 
    if (fileObj.seekg(offset) && fileObj.read(&size, sizeof(char))) 
    { 
     char* name = new char[size]; 
     if (fileObj.read(name, size)) 
     { 
      cout << name << endl; 
     } 
     delete [] name; 
    } 
} 
+0

ありがとう、これは束を助けた。私がゴミの結果を得た理由は、各文字列に32ビットのインターガーが続いていたからです。基本的にフラグの束。そのすべては今修正:D – UnWorld

関連する問題