2011-01-16 5 views
0

私はCプログラムを使って長い整数の配列を読み込んでいるバイナリデータを持っています。C言語のバイナリファイルを読んでいるときにデータをゼロにする

バイナリデータのhexdumpは、最初のいくつかのデータポイントの後に、20000の16進アドレス離れた場所で再び開始することを示しています。 hexdumpの出力は以下のようになります。

0000000 0000 0000 0000 0000 0000 0000 0000 0000 
* 
0020000 0000 0000 0053 0000 0064 0000 006b 0000 
0020010 0066 0000 0068 0000 0066 0000 005d 0000 
0020020 0087 0000 0059 0000 0062 0000 0066 0000 

...のように... しかし、私は典型的なfreadコマンドによって、長い整数の配列「データ」にそれを読んだときにそれがすべてゼロで埋めている

fread(data,sizeof(*data),filelength/sizeof(*data),fd); 

それが20000の場所に達するまで、私のデータ配列で。その後、データを正しく読み込みます。 なぜ私のファイルが存在しない地域を読んでいるのですか?または、どのように私はそれが私のファイルを読み取るようにしますか?

私はそれが些細な問題のように見えますが、ある夜、グーグルリングしてもそれを理解することはできません。 誰かが私にそれを間違っていると私に示唆することはできますか?

その他の情報:私はGNU/Linuxマシンで作業しています。 (具体的にはslax-atmaディストリビューション)。私のCコンパイラはgccです。

+0

あなたのhexdumpは、アドレス0のデータ値「0」を表示します。アドレス0x20000より前のデータ値がゼロでないhexdump出力を表示できますか? – mtrw

答えて

5

16進ダンプ出力は、データの最初の行(16バイト)がすべてゼロであることを示します。 '*'は、オフセット0x0020000に達するまで、次の行が同じであることを示します。したがって、ファイルの先頭はすべてゼロです。

読み取り呼び出しは、Unix/Linuxインターフェイスで定義されているため、ディスクにゼロが存在しているかのようにファイルを読み取ります。ディスクに格納されているかどうかは重要ではありません。あなたのプログラムに関する限り、彼らはそこにいます。

ファイルの「すべてゼロ」部分をスキップする場合は、最初にすべてゼロのファイルを書き込まないようにしてください。失敗した場合は、ゼロ以外の情報を見つけるまで、または固定オフセットを使用してゼロをジャンプするまで、データをチャンク単位で読み取る方法を決定する必要があります。

UnixとLinux上のファイルシステム抽象化は、物理的にディスクに格納されているかどうかにかかわらず、ゼロが読み取られることを意味します。それらをスキップするには、その数を知り、過去を探したり、データを読み込んだり破棄したりすることによって、どのようにしたいかを知る必要があります。

+0

ありがとうございました..問題はバイナリファイルそのものとは考えられませんでした。私は今、それらの多くのゼロがどのようにバイナリファイルに入ったのか調べてみましょう。私は、次の行が16進数で同じであることを示す「*」を認識しませんでした。再度、感謝します。 -indiajoe – indiajoe

2

「なぜ私のファイルが存在しない地域を読んでいるのですか?」

しかし間違っています。ゼロはファイル内の有効なデータです。それで、それらのゼロを読み取ります。それは正しく動作します。

0をスキップする場合は、1つの数字を別の数字にフリーダイヤルし、0の場合はスキップしなければなりません。また、データセット全体をメモリに読み込んだ後に縮小することもできます(メモリを必要としますが、ディスクから数値を1つずつ読み込むよりも高速です)。

+0

ありがとうございます。バイナリファイルそのものにそれほどの零点があることはわかりませんでした。どのくらいの零点がファイルにどのように入ってくるかを理解する。 – indiajoe

関連する問題