• ベストアンサー

最大長を用意せずにバイナリデータを読み出すには

こちらの続きになります。 http://oshiete1.goo.ne.jp/qa4420902.html ↑では配列の最大長を予め決めて行いましたが、 最大長を予め決めずにプログラミングするには どのようにしたらよいのでしょうか? バイナリデータを読み込むため、freadを用いる事に なると思いますが、第三引数は最大長になってしまうため どのようにしたら良いのか悩んでいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

とりあえず、何度も繰り返しますが質問する際には問題となるソースは開示してください。 今回ならfread()の周囲は必須。 前の質問 > len = fread( moji, 1, 10000, (FILE*)pInFileName ); のあたりが理解できていないような感じですが、 上記は 「pInFileNameで開かれているファイルから 1byteずつ、最大10000回読み込み、読み込んだ内容をmojiに入れていき、読み込めた『回数』を lenに入れる」 です。 従って、「1Byteずつ読んだ回数」がlenに入りますから、結果的にlenには読み込めたByte数が入っていることになります。

sakuranb22
質問者

お礼

その10000のところを勘違い、というか知らずに最大値設定しておけばいいのか!と思っていたんですが、読み込む回数なんですね。 おかげさまで意味がわかりました。

その他の回答 (2)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

前の質問の回答に「バイナリファイルは、自分で長さを管理しなければならない」って書いてあるのがありませんでしたか? ファイルを16進で表示したいなら、例えば 82 E0 82 A4 8F AD 82 B5 95 D7 8B AD 82 B5 82 E6 82 A4 81 42 8F 43 8D 73 82 AA 91 AB 82 E8 82 DC 82 B9 82 F1 81 42 みたいに「16バイトを1行づつに表示」したりと「自分が見やすい長さ」で区切って表示するでしょう。 「16バイトを1行づつ」なら「16バイトづつ処理すれば良い」し、256バイトなら、256バイトづつ処理すれば良いだけです。 このように「処理単位」を自分で決めないと、何も出来ません。 で、普通は「外部記憶装置の特性に合わせたサイズにする」のが普通です。 これが「バイナリファイルは、自分で長さを管理しなければならない」って意味です。 >バイナリデータを読み込むため、freadを用いる事に >なると思いますが、第三引数は最大長になってしまうため >どのようにしたら良いのか悩んでいます。 自分で好きな大きさに決めましょう。決める時は、システムに負荷をかけないサイズで、2のべき乗数(2、4、8、16、32、64…)にしましょう。 「好きな大きさ」と言っても「1ギガバイトの配列を用意して、一気に1ギガバイト読もう」などと、巨大なサイズにしてはいけません。 1ギガのメモリを確保しようとしたら、システムに負荷がかかり「メモリを確保しに行ったきり、戻ってこない。プログラムが止まっちゃった」なんて事も起きますからね。 普通は256とか512とか1024とか、2のべき乗の、キリの良い数字にします。 で、1024に決めたなら、1024バイトの配列を用意し、そこに「最大、1024バイト読んで、読めたバイト数分だけ、16進で表示して」ってのを「読み込んだバイト数が0になるまで、繰り返す」のです。 それと「巨大なサイズはダメ」の逆で「極小サイズも良くない」です。 例えば、「最大サイズ」を「1」とかにしちゃうと、1バイト読むたんびにfreadから戻って来て、処理が遅くなります。 1キロバイトの配列が用意出来るなら、一気に1キロバイト読んじゃった方が処理が早くなります。 このように「どのくらいの単位で処理すれば良いか?」は「使えるメモリの量」「システムにかかる負荷」「呼び出し回数の多い少ない」など、実行環境を鑑みて、自分で決めないとなりません。

回答No.1

1byteづつ読込んで、freadの辺値が0になるまで繰り返せば よろしいのでは。 while (fread(ptr, 1, 1, stream ) > 0) {   処理 }

関連するQ&A