From: nobu@... Date: 2015-05-24T23:20:40+00:00 Subject: [ruby-dev:48998] [Ruby trunk - Bug #11177] DATAでEOF文字以降が読めない 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 -- https://bugs.ruby-lang.org/