Project

General

Profile

Actions

Bug #1807

closed

r+ オープンしたファイルが MinGW の拡張ライブラリで扱えない

Added by ykc@venus.dti.ne.jp (Kimura Yoshihiro) over 15 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
Backport:

Description

=begin
手元に FILE* を扱う拡張ライブラリがあり、1.9 へ移植しているのですが、
Windows (MinGW) でうまくいかない処理があります。

処理としては、以下のように GetOpenFile -> rb_io_stdio_file で
取り出した FILE* から何かを読む、というだけの処理なのですが、
r+ でオープンすると何も読むことができません。

/* 拡張ライブラリサンプル /
#include <stdio.h>
#include <ruby.h>
#include <ruby/io.h> /
1.8 では <rubyio.h> */

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 周りはかなり変わったようなので、もしおかしなことを
しているようならご指摘下さい。
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0