タイトル見ただけではなんのこっちゃかもわかりませんが
行いたい事は以下の通りです。
バイナリファイル(画像ファイル)、仮に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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
【python】Excelファイルを読み...
-
バイナリエディタのつかいかた
-
画素値取得について
-
BMP画像の画像データ本体をテキ...
-
ゲームのパラメータの読み込み...
-
FTPでエクセルをPUTするとファ...
-
入力ファイルをバイナリにする利点
-
EOF
-
VB2010 COMポートからのバイナ...
-
24ビットのWaveデータの中身に...
-
C言語で、ファイルを読み込んで...
-
ビットマップファイル生成(C言...
-
エクセルVBA 2千万行のCSVファ...
-
HDDのバイナリイメージの取得方...
-
C言語の質問です。バイナリ形...
-
bitmap画像の保存がうまくいき...
-
地熱発電などでいう「バイナリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
ページ読み込み時に自動的にsub...
-
エクセルVBA 2千万行のCSVファ...
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
入力ファイルをバイナリにする利点
-
バイナリエディタのつかいかた
-
MacからWinにファイルを添付す...
-
EOF
-
【python】Excelファイルを読み...
-
C言語の質問です。バイナリ形...
-
画像の保存方法。
-
テキストデータをSQLServerに取...
-
バイナリファイルの比較につい...
-
bitmap画像の保存がうまくいき...
-
なぜデータの整合性を確認する...
-
C言語とシリアル通信の送受信...
-
【Teraterm】filewritelnについて
おすすめ情報