# \[Bug:trunk\] readpartial after ungetc fails with text mode

**URL:** <https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189>\
**Category:** Development\
**Created:** [February 26, 2010, 11:35am UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189 "2010-02-26T11:35:02Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2010, 11:35am UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/1 "2010-02-26T11:35:02Z")

</div>

e$B1sF#$G$9!#e(B

e$B0J2\<$N$h$&$K$9$k$H!“e(B"a” e$B$,=PNO$5$l$k$3$H$r4|BT$9$k$N$G$9$,!"e(B  
EOFError e$B$K$J$j$^$9!#e(B

$ echo -n a \> foo.txt && ./ruby -e ’  
open(“foo.txt”, “r+t”) do |f|  
f.ungetc(f.getc)  
p f.readpartial(2)  
end  
’  
-e:4:in `readpartial': end of file reached (EOFError) from -e:4:in`block in ’  
from -e:2:in `open' from -e:2:in`’

mingw32 e$B$G$Ne(B rubyspec e$B$,$3$N$;$$$G8G$^$k$h$&$G$9e(B (mingw32  
e$B$@$He(B “r+” e$B$@$1$GLdBj$K$J$ke(B) e$B!#e(B

e$B$3$&$$$&E?Kv$\_$?$$$G$9!#e(B

1. text mode e$B$@$He(B ungetc e$B$,e(B rbuf e$B$G$J$/e(B cbuf  
e$B$K5-O?$9$ke(B
2. readpartial e$B$Oe(B rbuf e$B$7$+8+$J$$e(B

readpartial e$B$,e(B cbuf e$B$b8+$k$Y$-$J$s$G$9$+$M!#e(B

e$B$3$l$Oe(B akr e$B$5$s$+@.@%$5$s$NC4Ev$G$$$$$G$7$g$&$+!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2010, 11:43am UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/2 "2010-02-26T11:43:13Z")

</div>

2010e$BG/e(B2e$B7ne(B26e$BF|e(B19:34 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 1. text mode e$B$@$He(B ungetc e$B$,e(B rbuf e$B$G$J$/e(B cbuf e$B$K5-O?$9$ke(B
> 2. readpartial e$B$Oe(B rbuf e$B$7$+8+$J$$e(B
> 
> readpartial e$B$,e(B cbuf e$B$b8+$k$Y$-$J$s$G$9$+$M!#e(B

e$B$$$$$(!#e(B

cbuf e$B$OJ8;z%3!\<%IJQ49:Q$_$N%G!\<%?$rCy$a$F$\*$/\>l=j$G$"$j!"e(B  
readpartial e$B$OJQ49A0$N%P%$%HNs$rFI$_=P$9%a%=%C%I$J$N$G!"e(B  
cbuf e$B$rFI$^$J$$$N$O@5$7$$F0:n$G$9!#e(B

cbuf e$B$,6u$G$J$1$l$PNc30$K$9$k$H$$$&A\*Br;h$O$"$j$($^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2010, 2:16pm UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/3 "2010-02-26T14:16:33Z")

</div>

2010e$BG/e(B2e$B7ne(B26e$BF|e(B20:19 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > e$B$$$$$(!#e(B  
> > e$B%P%C%U%!%j%s%0$7$F$$$k$H$+%f!\<%6$,5$$K$7$J$/$F$b$$$$$h$&$K$J$i$J$$e(B  
> > e$B$b$N$+$J$"!#e(B

e$B$3$NLdBj$,I=LL2=$9$k$N$Oe(Bungetc()e$B$@$1$J$N$G!“%P%C%U%!$,#2$D$”$k$H$$$&\<BAu$r=q$/I,MW$O$J$/$Fe(B  
ungetc()e$B$N%a%=%C%I$N@bL@$K%P%$%J%jFI$_9~$_$HAH$\_9g$o$;$?$i7k2L$OITDj$@$h!#$He(B  
e$BDI5-$9$l$P:Q$`OC$G$O$J$$$+$J$!e(B

e$B8=\<B@$3&$G!"$=$&$$$&MWK\>$O$3$J$5$=$&$@$7!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2010, 12:20pm UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/4 "2010-02-26T12:20:06Z")

</div>

e$B1sF#$G$9!#e(B

2010e$BG/e(B2e$B7ne(B26e$BF|e(B19:42 Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> readpartial e$B$OJQ49A0$N%P%$%HNs$rFI$\_=P$9%a%=%C%I$J$N$G!"e(B  
> cbuf e$B$rFI$^$J$$$N$O@5$7$$F0:n$G$9!#e(B

e$B$&$&!"e(B1.9 e$B$Ne(B IO e$B$OK\Ev$KFq$7$$$G$9$M!#e(B

IO#readpartial e$B$He(B ungetc e$B$Ne(B rdoc e$B$r$Q$C$H8+$F$be(B  
“buffer” e$B$N\<oN`$,e(B  
e$BJ#?t$“$k$H$OFI$\_\<h$l$J$+$C$?$N$G$9$,!”$I$3$+$K=q$$$F$“$k$3$H$G$9$+!)e(B  
e$B%P%C%U%!%j%s%0$7$F$$$k$H$+%f!\<%6$,5$$K$7$J$/$F$b$$$$$h$&$K$J$i$J$$e(B  
e$B$b$N$+$J$”!#e(B

e$B$H$j$"$($:!"e(BRubySpec e$BB&$Ge(B pipe e$B$re(B binmode  
e$B$K$7$F$7$N$.$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2010, 3:54pm UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/5 "2010-02-26T15:54:18Z")

</div>

2010e$BG/e(B2e$B7ne(B26e$BF|e(B22:06 KOSAKI Motohiro  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B$3$NLdBj$,I=LL2=$9$k$N$Oe(Bungetc()e$B$@$1$J$N$G!“%P%C%U%!$,#2$D$”$k$H$$$&\<BAu$r=q$/I,MW$O$J$/$Fe(B  
> ungetc()e$B$N%a%=%C%I$N@bL@$K%P%$%J%jFI$_9~$_$HAH$\_9g$o$;$?$i7k2L$OITDj$@$h!#$He(B  
> e$BDI5-$9$l$P:Q$`OC$G$O$J$$$+$J$!e(B

e$B%3!\<%IJQ49$,$$$A$I$KJ#?tJ8;z$r@8@.$7$?$H$-!"e(B  
e$BFI$_9~$_%a%=%C%I$,$=$l$i$r$9$Y$F$O\>CHq$;$:!"e(B  
e$B0lIt$re(B cbuf e$B$K;D$92DG=@-$,9M$($i$l$^$9!#e(B

e$B8=;~E@$G6qBNE\*$K$"$k$+$H$$$&$He(B LF → CR LF  
e$BJQ49$rFI$\_=P$7B&$G9T$&$H$+e(B  
e$B$+$J$j$`$j$d$j$JNc$7$+;W$$$D$+$J$$$s$G$9$,!"e(B  
e$B$$$A$\*$&!“e(BUnicode e$B$Ne(B normalization  
e$B$J$IA[Dj$5$l$kMQES$O$”$j$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2010, 4:10pm UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/6 "2010-02-26T16:10:41Z")

</div>

2010e$BG/e(B2e$B7ne(B26e$BF|e(B20:19 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> IO#readpartial e$B$He(B ungetc e$B$Ne(B rdoc e$B$r$Q$C$H8+$F$be(B “buffer” e$B$N\<oN`$,e(B  
> e$BJ#?t$“$k$H$OFI$\_\<h$l$J$+$C$?$N$G$9$,!”$I$3$+$K=q$$$F$"$k$3$H$G$9$+!)e(B

readpartial e$B$H$$$&$h$j$O!“%P%$%HC10L$N%5%$%:$r;XDj$9$k%a%=%C%I$Oe(B  
e$B4pK\E\*$K%P%$%HNs%l%Y%k$GF0:n$9$k$H$$$&!”$h$j0lHLE\*$JOC$J$s$G$9$,!“e(B  
e$B=q$$$F$”$C$?$+$J$!!#e(B

> e$B%P%C%U%!%j%s%0$7$F$$$k$H$+%f!\<%6$,5$$K$7$J$/$F$b$$$$$h$&$K$J$i$J$$e(B  
> e$B$b$N$+$J$"!#e(B

e$B$=$N$3$H\<+BN$ONI$$$H;W$&$N$G!"$=$N$?$a$K$G$-$k$3$H$r;W$$$D$$$F!“e(B  
e$B32$,L5$1$l$P!”\<BAu$7$FF~$l$F$$$/$N$,$$$$$s$8$c$J$$$G$9$+$M!#e(B

e$B40`z$K$d$k$N$OL5M}$@$H;W$&$s$G$9$,!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2010, 4:18pm UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/7 "2010-02-26T16:18:18Z")

</div>

2010e$BG/e(B2e$B7ne(B27e$BF|e(B0:10 Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 2010e$BG/e(B2e$B7ne(B26e$BF|e(B20:19 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > IO#readpartial e$B$He(B ungetc e$B$Ne(B rdoc e$B$r$Q$C$H8+$F$be(B “buffer” e$B$N\<oN`$,e(B  
> > e$BJ#?t$“$k$H$OFI$\_\<h$l$J$+$C$?$N$G$9$,!”$I$3$+$K=q$$$F$"$k$3$H$G$9$+!)e(B
> 
> readpartial e$B$H$$$&$h$j$O!“%P%$%HC10L$N%5%$%:$r;XDj$9$k%a%=%C%I$Oe(B  
> e$B4pK\E\*$K%P%$%HNs%l%Y%k$GF0:n$9$k$H$$$&!”$h$j0lHLE\*$JOC$J$s$G$9$,!“e(B  
> e$B=q$$$F$”$C$?$+$J$!!#e(B

[http://doc.okkez.net/static/191/class/IO.html](http://doc.okkez.net/static/191/class/IO.html)

e$B$N!V%(%s%3!\<%G%#%s%0$N1F6A$r\<u$1$k%a%=%C%I$H\<u$1$J$$%a%=%C%I!W$KJ,N`$,=q$$$F$“$k$N$G$9$,!“e(B  
ungetc()e$B$N$h$&$J%P%$%J%jFI$_9~$_%a%=%C%I$KBP$7$FI{:nMQ$,$”$k%a%=%C%IB&$K!”$=$N;]$Ne(B  
e$B5-:$,$J$$$N$,LdBj$H$$$&G’\<1$G$$$k$N$G$9$,!&!&!&e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [April 24, 2010, 7:47am UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/8 "2010-04-24T07:47:34Z")

</div>

e$B%A%1%C%He(B #2795 e$B$,99?7$5$l$^$7$?!#e(B (by Akira T.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

This issue was solved with changeset r27470.  
Yusuke, thank you for reporting this issue.  
Your contribution to Ruby is greatly appreciated.  
May Ruby be with you.

* * *

[http://redmine.ruby-lang.org/issues/show/2795](http://redmine.ruby-lang.org/issues/show/2795)

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [April 20, 2010, 3:15pm UTC](https://www.ruby-forum.com/t/bug-trunk-readpartial-after-ungetc-fails-with-text-mode/184189/9 "2010-04-20T15:15:20Z")

</div>

e$B%A%1%C%He(B #2795 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$BC4Ev\<Te(B Akira T.e$B$K%;%C%He(B  
Target version 1.9.2e$B$K%;%C%He(B  
ruby -v ruby 1.9.2dev (2010-04-20 trunk 27405)  
[i686-linux]e$B$K%;%C%He(B

akr e$B$5$se(B  
e$B1sF#$G$9!#e(B

e$B$3$N5sF0$Oe(B by design e$B$H$$$&$3$H$G$9$,!"e(BIO#ungetc e$B$Ne(B  
rdoc e$B$Ke(B

Pushes back one character (passed as a parameter) onto _ios_,  
such that a subsequent buffered read will return it.

e$B$H=q$$$F$“$j!”$+$De(B IO#readpartial e$B$Ne(B rdoc e$B$Ke(B

If the buffer is not empty, read from the buffer instead of  
“sysread for buffered IO (IOError)”.

e$B$H=q$$$F$"$k$N$G!“e(Brdoc  
e$B$,4V0c$C$F$$$k$+!”$^$?$OHs\>o$K$o$+$j$K$/$$e(B  
e$B$H;W$$$^$9!#e(B

IO e$B$Ne(B rdoc e$B$K$O\<j$,=P$;$J$$e(B (e$B;EMM$Oe(B akr  
e$B$5$s$NF,$NCf$K$7$+$J$$e(B  
e$B$h$&$J5$$,$9$ke(B) e$B$N$G!“=$@5$7$F$$$?$@$1$^$;$s$G$7$g$&$+!#e(B  
e$B$3$N=$@5$r0J$F$3$N%A%1%C%H$rJD$8$k!”$H$$$&$3$H$G$I$&$G$7$g$&!#e(B

## – Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

[http://redmine.ruby-lang.org/issues/show/2795](http://redmine.ruby-lang.org/issues/show/2795)
