• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バイナリデータの最後数バイトを削除したい)

バイナリデータの最後数バイトを削除する方法

このQ&Aのポイント
  • バイナリデータの最後数バイトを削除する方法について紹介します。
  • ファイルを開くタイプで途中からデータを上書きする方法について説明します。
  • ファイルデータを送受信するプログラムで途中からの受信が可能になる方法を考えていますが、途中からデータを上書きする方法がわかりません。

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

  • ベストアンサー
回答No.2

"rb+"では駄目でしたか?

Null0lluN
質問者

お礼

ベストアンサーをどの方にするか悩みましたが、質問の答えとして一番適していると思われ、かつ一番最初にお答えいただいたduke_kimuraさんにしようと思います。 みなさんありがとうございました

Null0lluN
質問者

補足

いえ、やってみたこと無いです。 やってみます

すると、全ての回答が全文表示されます。

その他の回答 (8)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.9

>>途中だからと言って前回と今回のファイルの内容が同じとは限りませんよ >え・・・・そうなんですか?ハッシュ値についてネットで調べてみましたが良く分かりませんでした・・・・・ その受信途中のファイルのファイル名を削除して 別のファイルを、そのファイル名にする。 とかされない保証はどこにもありませんから。

Null0lluN
質問者

補足

>その受信途中のファイルのファイル名を削除して >別のファイルを、そのファイル名にする。 >とかされない保証はどこにもありませんから。 なるほど。相手は友達ですし、そういうことはしないように頼むことにします。

すると、全ての回答が全文表示されます。
回答No.8

rb+でオープンすれば、やりたいことはできると思いますが、 他の方も言っているとおり、通常追記だけで十分なように仕様を作った方がよいです。 レジューム機能を実現したいなら、 4MBとか区切りじゃなくても継続して受信できるように 接続時の初期化を工夫したほうがいいですよ。 送受信独自のアプリっぽいですし? ところで、途中から始めるときにハッシュ値の採取してますか? 途中だからと言って前回と今回のファイルの内容が同じとは限りませんよ。

Null0lluN
質問者

補足

>レジューム機能を実現したいなら、 日曜プログラマ程度ですし、友達にSkype使うより早く大容量データを送りたいというだけなので、難しい話は極力回避したいです。 >途中だからと言って前回と今回のファイルの内容が同じとは限りませんよ え・・・・そうなんですか?ハッシュ値についてネットで調べてみましたが良く分かりませんでした・・・・・

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.7

>4MBを一発で受信できるとは限らないので、 >途中で回線が落ちたとかした場合、最後に保存されたデータが4MBに満たない可能性があるからです。 私なら4Mには設定しませんね…。 16kか32k、せいぜい64kくらいでしょうかね。 回線が速いとしても。 # LAN内しか想定しないのであれば、もう少し増やすかも知れませんが。

Null0lluN
質問者

補足

インターネットを介して遠方の友人に送るつもりです。 >16kか32k、せいぜい64kくらいでしょうかね。 多ければいいと思っていました。 一番いいのは16kでしょうか?

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

「正しく受信できたデータのみがファイルに書き込まれている」という条件さえ成り立っていれば, 「追加する」だけでできるはず.

Null0lluN
質問者

補足

なるほど。4MBを受信しきってから書き込めばいいんですね

すると、全ての回答が全文表示されます。
回答No.5

ファイルタイプは、多分、r+b たとえば、「ファイルを開くタイプ」で困ったら、fopen() のマニュアルを確認するような癖をつけておくと、幸せになれるかもしれません。

Null0lluN
質問者

補足

一応、質問する前にこのサイト(http://www9.plala.or.jp/sgwr-t/c/sec17.html)で確認したのですが w・a・w+・a+しか見てませんでした・・・・・ rは読み込みだからr+は脳内で勝手に(思い込みで)認識されなかったんじゃ・・・・

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

fopen のモードを適切に選べばいいだけなんだけど.... ど~いうロジックで組んだら「途中からデータを上書きする」必要があるんだろう.

Null0lluN
質問者

補足

4MBを一発で受信できるとは限らないので、 途中で回線が落ちたとかした場合、最後に保存されたデータが4MBに満たない可能性があるからです。 完全に続きから、というのは面倒だったので、いっそのこと最後の端数は再受信しなおそうかと

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>数GB単位のファイルデータを 保存しようとしているファイルシステムによっては問題起こすこともあるのでご注意を。 ランタイムライブラリの方は…どうでしたかねぇ。 # 2Gを越える場合は_fseeki64()とかになる場合も。 ゲームのデータファイルで1ファイルが2G越えるとかは…ちょっと遠慮して頂きたいところではありますけどねぇ。 # もう少し分割するなりして管理すべき…でしょうし。

Null0lluN
質問者

補足

>ゲームのデータファイルで1ファイルが2G越えるとかは…ちょっと遠慮して頂き>たいところではありますけどねぇ。 ゲームに限った話ではないんです。動画とかetc まとめて圧縮ファイルにしてあるのですが、中身を一つずつ送るのも面倒ですし・・・・・

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>しかし、ファイルを開くタイプで、”wb”だと、ファイルは開いた瞬間に空になりますし、"ab"だと追加書き込みで消すことができません。 "ab"でオープンした後、fseek()で移動させる。 でしょうかね。 ただし、Windowsの方ではファイルサイズを「切り詰める」のは難しそうです。 # APIならある…みたいですが。 切り詰めるのではなく、上書きするのであればfseek()で移動した後にそのままfwrite()で書き込んでいけばよいでしょう。 # fwrite()での上書きが元ファイルのサイズより小さい場合は後ろに意図しないゴミが残ることになるでしょうけど。 他の方法としては… 別名で新たにファイルを作成して必要な分だけ元ファイルから読み込んで新しいファイルに書き出す。 とかでしょうか。 コピーが終わった後で元ファイルは削除することになりますが。

Null0lluN
質問者

補足

>切り詰めるのではなく、上書きするのであればfseek()で移動した後にそのまま>fwrite()で書き込んでいけばよいでしょう。 最初にやってみたのですが、 ># fwrite()での上書きが元ファイルのサイズより小さい場合は後ろに意図しないゴミが残ることになるでしょうけど。 まさにこの状況でした。 >別名で新たにファイルを作成して必要な分だけ元ファイルから読み込んで新しいファイルに書き出す。 やっぱりその方が確実ですよね・・・・

すると、全ての回答が全文表示されます。

関連するQ&A