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/