From: Kimura Yoshihiro Date: 2009-07-23T12:00:22+09:00 Subject: [ruby-dev:38882] [Bug #1807] r+ オープンしたファイルが MinGW の拡張ライブラリで扱えない Bug #1807: r+ オープンしたファイルが MinGW の拡張ライブラリで扱えない http://redmine.ruby-lang.org/issues/show/1807 起票者: Kimura Yoshihiro ステータス: Open, 優先度: Normal ruby -v: ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] 手元に FILE* を扱う拡張ライブラリがあり、1.9 へ移植しているのですが、 Windows (MinGW) でうまくいかない処理があります。 処理としては、以下のように GetOpenFile -> rb_io_stdio_file で 取り出した FILE* から何かを読む、というだけの処理なのですが、 r+ でオープンすると何も読むことができません。 /* 拡張ライブラリサンプル */ #include #include #include /* 1.8 では */ static VALUE fget(VALUE self, VALUE arg) { rb_io_t* fptr; FILE* f; int i; GetOpenFile(arg, fptr); rb_io_check_readable(fptr); f = rb_io_stdio_file(fptr); /* 1.8 では GetReadFile */ if ((i = fgetc(f)) != EOF) { char c = i; return rb_str_new(&c, 1); } return Qnil; } void Init_fget() { rb_define_singleton_method( rb_define_module("F"), "get", RUBY_METHOD_FUNC(fget), 1 ); } # Ruby側サンプル require './fget.so' File.open('test.dat', 'w') {|f| f.write "123" } File.open('test.dat', 'r+') {|f| # 読めない(rb+も同様) p F.get(f) # => nil p F.get(f) # => nil p F.get(f) # => nil } File.open('test.dat', 'r') {|f| # 読める(rbも同様) p F.get(f) # => "1" p F.get(f) # => "2" p F.get(f) # => "3" } Linux の Ruby 1.9.1 では問題ありません。 1.9 の IO 周りはかなり変わったようなので、もしおかしなことを しているようならご指摘下さい。 ---------------------------------------- http://redmine.ruby-lang.org