[ruby-dev:48998] [Ruby trunk - Bug #11177] DATAでEOF文字以降が読めない
From:
nobu@...
Date:
2015-05-24 23:20:40 UTC
List:
ruby-dev #48998
Issue #11177 has been updated by Nobuyoshi Nakada.
Yusuke Endoh wrote:
> Windows で `__END__` 以降に EOF 文字 (`\x1A`) があったとき、それより先が読めないのは仕様でしょうか。
text modeでそうなるというのは当然仕様でしょう。
> `DATA.binmode.read` などとしてみても同じです。
その時点ではもう読んじゃってますから。
> もちろん、Linux では先まで読めます。Windows でも、ソースコードをパイプで流し込んだ場合はなぜか読めます。
`\x1A`がEOFとみなされるのは、ファイルから読んだときだけです。
> さらに、EOF 以降に文字がいっぱいあった場合、EOF 以降の一部の文字が抜け落ちるような挙動になるようです。
>
> gen2.rb:
>
> puts "p DATA.read"
> puts "__END__"
> puts "foo\x1A" + "X" * 8192 + "Z"
>
> > ruby gen2.rb > t.rb
> > ruby t.rb
> "fooXXXXXXXXXXXXXXXXXXXXXXXXXXXZ\r\n"
>
> バッファリングのバグっぽい挙動ですが、バグでしょうか。
これは`DATA`を使わなくとも再現しますね。
$ ./ruby -e 'puts "foo\x1A" + "X" * 8192 + "Z"' > txt
$ ./ruby -e 'open("txt"){|f|p f.gets; p f.read}'
"foo"
"XXXXXZ\n"
----------------------------------------
Bug #11177: DATAでEOF文字以降が読めない
https://bugs.ruby-lang.org/issues/11177#change-52625
* Author: Yusuke Endoh
* Status: Open
* Priority: Normal
* Assignee:
* ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
遠藤です。
Windows で `__END__` 以降に EOF 文字 (`\x1A`) があったとき、それより先が読めないのは仕様でしょうか。
gen.rb:
puts "p DATA.read"
puts "__END__"
puts "foo\x1Abar"
以下のように実行すると再現します。
> ruby gen.rb > t.rb
> ruby t.rb
"foo"
`DATA.binmode.read` などとしてみても同じです。
もちろん、Linux では先まで読めます。Windows でも、ソースコードをパイプで流し込んだ場合はなぜか読めます。
> ruby < t.rb
"foo\x1Abar\n"
さらに、EOF 以降に文字がいっぱいあった場合、EOF 以降の一部の文字が抜け落ちるような挙動になるようです。
gen2.rb:
puts "p DATA.read"
puts "__END__"
puts "foo\x1A" + "X" * 8192 + "Z"
> ruby gen2.rb > t.rb
> ruby t.rb
"fooXXXXXXXXXXXXXXXXXXXXXXXXXXXZ\r\n"
バッファリングのバグっぽい挙動ですが、バグでしょうか。
--
Yusuke Endoh <mame@ruby-lang.org>
--
https://bugs.ruby-lang.org/