yamada
yamad****@tir*****
2004年 9月 12日 (日) 12:15:47 JST
山田です。 dbm.fsdbmに、バイナリデータ(画像データ)を保存し、 あとでそれを読み取るような事をさせようとしています。 保存は正常に行えるのですが、読み取り時に、 encountered EOF in middle of a multibyte character from port #<iport fsdbm内のファイル名> のようなエラーになってしまいました。 調べてみたところ、fsdbmの139行目付近でport->stringを使っていて、 そして、port->stringは内部でread-charを使って ファイルを読み込んでいるようなので、 (/usr/local/share/gauche/0.8/lib/gauche/portutil.scm の50行目付近) たまたま試したデータの末尾が不完全な文字列になっていたので、 このような結果になってしまったようです。 試しに、portutil.scmのport->stringの、 read-char, write-charの箇所をread-byte, write-byteに変更して、 不完全な文字列も読み込めるようにしてみたところ、 自分の期待通りに動作するようにはなりました。 これが一番正しいやり方なのかはかなり微妙な気がするのですが、 一応、自分の対応を行った箇所のパッチを張り付けておきます。 どうかよろしくお願い致します。 --- portutil.scm.orig 2004-09-12 12:07:10.000000000 +0900 +++ portutil.scm 2004-09-12 12:02:09.000000000 +0900 @@ -47,10 +47,10 @@ (let ((out (open-output-string :private? #t))) (with-port-locking port (lambda () - (let loop ((ch (read-char port))) + (let loop ((ch (read-byte port))) (unless (eof-object? ch) - (write-char ch out) - (loop (read-char port)))) + (write-byte ch out) + (loop (read-byte port)))) (get-output-string out))))) (define (port->list reader port)