[Gauche-devel-jp] dbm.fsdbmで、バイナリデータをreadする時にエラー

Back to archive index

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)





Gauche-devel-jp メーリングリストの案内
Back to archive index