Bug #400
closedPossible bug in IO#ungetc
Description
=begin
According to the documentation for IO#ungetc:
bq.
"Only one character may be pushed back before a subsequent
read operation (that is, you will be able to read only the
last of several characters that have been pushed back)."
But that doesn't seem to be the case:
file.txt
Voici la ligne une.
Qui è la linea due.
Aquà está la lÃnea tres.
Ist hier Linie vier.
Está aqui a linha cinco.
Here is line six.
Rubyspec:
@file = File.open("file.txt", "r")
@file.getc
10.times { @file.ungetc(90) }
@file.ungetc(80)
@file.read(1).should == "P"
@file.readline.should == "oici la ligne une.\n"
#=> IO#ungetc pushing back only one character FAILED
Expected "ZZZZZZZZZZoici la ligne une.\n"
to equal "oici la ligne une.\n"
Are we misunderstanding the documentation and this works as expected or is it a bug indeed?
=end
Updated by shyouhei (Shyouhei Urabe) over 16 years ago
=begin
That depends. As C standard only guarantees one ungetc at a time, multiple ungetc may or may not be doable, depending on your (underlying) libc's stdio implementation. It is nicer for programmers not to do multiple ungetc to earn maximum portability, so saying no in documents is basically a good thing I think.
=end
Updated by nobu (Nobuyoshi Nakada) over 16 years ago
=begin
Hi,
At Sun, 3 Aug 2008 10:13:57 +0900,
Anonymous wrote in [ruby-core:18092]:
According to the documentation for IO#ungetc:
bq.
"Only one character may be pushed back before a subsequent
read operation (that is, you will be able to read only the
last of several characters that have been pushed back)."But that doesn't seem to be the case:
It depends on the behavior of underlying stdio. The doc should
be:
"Only one character is guaranteed ...
--
Nobu Nakada
=end
Updated by febuiles (Federico Builes) over 16 years ago
=begin
Thanks for your input, I'll modify the specs to reflect this behavior then.
=end