タイトル見ただけではなんのこっちゃかもわかりませんが
行いたい事は以下の通りです。
バイナリファイル(画像ファイル)、仮に15Kバイトのサイズだったとします。
それを10Kバイト区切りで読み込みたい。
そして変数$str1,$str2に格納したい。
open(BIN, "< test.gif");
binmode(BIN);
#ファイルの先頭から10Kバイト読み込んで変数$str1に代入
sysread(BIN, $str1, 10000);
#上記で読み込んだ個所から、残りのデータを読み込みたい
#オフセット10Kバイトから5Kバイト読み込む
sysread(BIN, $str2, 5000,10000);
close(BIN);
のような処理でいいのかと思っていたのですが、
$str2には期待通りの形で格納されませんでした。
先頭の10000バイト(オフセットで指定したサイズ)がNULLになっており、
その先から残りのバイナリデータが格納されていました。
自分が行いたいのは、
$str2の先頭から、バイナリファイルのオフセットの値
(ここでは10Kの部分からのこりの5K)
を格納したいのです。
この関数ではダメだと思うのですが、
自分の行いたい処理の関数が見当たらず困っております。
どなたかご存知の方、どうぞよろしくお願い致します。
No.5ベストアンサー
- 回答日時:
ファイル読み書きの位置を指定する場合は、seek を使いファイルポインタをセットします。
書式:
seek ファイルハンドル, オフセット, 起点
起点には次の値を指定します。
0: ファイルの先頭
1: 現在位置
2: ファイルの末尾
戻値は新しいポジション(ファイル先頭からのオフセット)で、失敗時には未定義値(undef)が返ります。
# 先頭から10000バイト目にファイルポインタをセット
seek BIN, 10000, 0;
ただし、sysread などを使っている場合、seek ではバッファリングの影響が出ることがあるので、sysseek を使った方がよいでしょう。使い方は seek と同じです。
また起点には、IO::Seekable か POSIX モジュールから定数をインポートして使用することができます。
use IO::Seekable;
または
use POSIX;
をしておくと、
SEEK_SET 0
SEEK_CUR 1
SEEK_END 2
が使用できます。
No.3
- 回答日時:
sysread(BIN, $str2, 5000,10000);
は誤りです。
sysread(BIN, $str2, 5000);
としてください。
これであなたが望んだ結果が得られます。
10000の意味は、$str2の10000バイト目以降へ読み込んだデータをセットするという意味です。ファイルの10000バイト目からデータを読み込むという意味ではありません。
この回答への補足
ご返答ありがとうございます。
試してみたのですが、自分の期待通りには動作しませんでした。
というのも、これは自分の説明不足だったので申し訳なかったです。
上記の形は説明の都合上同時に処理しているので
Read時のファイルポインター(?)の場所を覚えている為か
連続したsysreadでうまくいくのですが
ファイルを読み込ませたい処理は別々にしたいのです。
15Kバイトの画像ファイルの10Kバイトの位置から
$strに読み込みたいだけ、の時は
(ファイいるの先頭から10Kバイトの読み込みは処理しない)
やはりオフセットして読み込む必要があるのかな、と。
お手間を取らせて申し訳なかったですが、
再度ご教授頂けると助かります。
No.2
- 回答日時:
シンプルに以下を試してみてください。
sysread(BIN, $str1, 10000);
sysread(BIN, $str2, 5000);
多分それでいけると思います。
つまり、オフセットの指定はいらないということです。
この回答への補足
ご返答ありがとうございます。
試してみたのですが、自分の期待通りには動作しませんでした。
というのも、これは自分の説明不足だったので申し訳なかったです。
上記の形は説明の都合上同時に処理しているので
Read時のファイルポインター(?)の場所を覚えている為か
連続したsysreadでうまくいくのですが
ファイルを読み込ませたい処理は別々にしたいのです。
15Kバイトの画像ファイルの10Kバイトの位置から
$strに読み込みたいだけ、の時は
(ファイいるの先頭から10Kバイトの読み込みは処理しない)
やはりオフセットして読み込む必要があるのかな、と。
お手間を取らせて申し訳なかったですが、
再度ご教授頂けると助かります。
No.1
- 回答日時:
sysread()の第4引数は、文字列変数に対して作用します。
ですので、使い方を間違えているような。素直に、
sysread BIN, $str1, 10000;
sysread BIN, $str2, 5000;
――で良いのでは。
この回答への補足
ご返答ありがとうございます。
試してみたのですが、自分の期待通りには動作しませんでした。
というのも、これは自分の説明不足だったので申し訳なかったです。
上記の形は説明の都合上同時に処理しているので
Read時のファイルポインター(?)の場所を覚えている為か
連続したsysreadでうまくいくのですが
ファイルを読み込ませたい処理は別々にしたいのです。
15Kバイトの画像ファイルの10Kバイトの位置から
$strに読み込みたいだけ、の時は
(ファイいるの先頭から10Kバイトの読み込みは処理しない)
やはりオフセットして読み込む必要があるのかな、と。
お手間を取らせて申し訳なかったですが、
再度ご教授頂けると助かります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
削除したファイルの復旧、およ...
-
VBAでバイト型データをファイル...
-
RS-232Cで接続したPC間のファイ...
-
【python】Excelファイルを読み...
-
EOF
-
クリップボードからファイル名...
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
DXFファイル用クラスライブラリ...
-
24ビットのWaveデータの中身に...
-
マイクラでPythonのプログラミ...
-
どんなプログラムを書いても指...
-
エラーの原因は?「この関数の...
-
パラメータが正しくありません...
-
VC++でexeファイルが作成できま...
-
VBAでMP3を鳴らしたい
-
C言語初心者の質問失礼します。
-
Java 3D Web Start のソースコ...
-
VBAで他のプログラムが起動して...
-
二次元配列をクリップボードに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
エクセルVBA 2千万行のCSVファ...
-
ページ読み込み時に自動的にsub...
-
EXCEL VBAでテキストファイルの...
-
EOF
-
【python】Excelファイルを読み...
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
24ビットのWaveデータの中身に...
-
FTPでエクセルをPUTするとファ...
-
テキストデータをSQLServerに取...
-
C言語とシリアル通信の送受信...
-
HDDのバイナリイメージの取得方...
-
EXCEL VBAで、バイナリデータの...
-
入力ファイルをバイナリにする利点
-
【Teraterm】filewritelnについて
-
Javaでのエンディアン変換
-
バイナリファイルの比較につい...
-
バイナリファイルの検索について
おすすめ情報