eof?()
public
Returns true if ios is at end of file that means there are no more
data to read. The stream must be opened for reading or an IOError will be raised.
f = File.new("testfile")
dummy = f.readlines
f.eof
If ios is a stream such as pipe
or socket, IO#eof? blocks until the other end sends some data or
closes it.
r, w = IO.pipe
Thread.new { sleep 1; w.close }
r.eof?
r, w = IO.pipe
Thread.new { sleep 1; w.puts "a" }
r.eof?
r, w = IO.pipe
r.eof?
Note that IO#eof? reads data to a input buffer. So
IO#sysread doesn't work with IO#eof?.
Show source
/*
* call-seq:
* ios.eof => true or false
* ios.eof? => true or false
*
* Returns true if <em>ios</em> is at end of file that means
* there are no more data to read.
* The stream must be opened for reading or an <code>IOError</code> will be
* raised.
*
* f = File.new("testfile")
* dummy = f.readlines
* f.eof #=> true
*
* If <em>ios</em> is a stream such as pipe or socket, <code>IO
* blocks until the other end sends some data or closes it.
*
* r, w = IO.pipe
* Thread.new { sleep 1; w.close }
* r.eof?
*
* r, w = IO.pipe
* Thread.new { sleep 1; w.puts "a" }
* r.eof?
*
* r, w = IO.pipe
* r.eof?
*
* Note that <code>IO
* So <code>IO
*/
VALUE
rb_io_eof(io)
VALUE io;
{
OpenFile *fptr;
int ch;
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
if (feof(fptr->f)) return Qtrue;
if (READ_DATA_PENDING(fptr->f)) return Qfalse;
READ_CHECK(fptr->f);
clearerr(fptr->f);
TRAP_BEG;
ch = getc(fptr->f);
TRAP_END;
if (ch != EOF) {
ungetc(ch, fptr->f);
return Qfalse;
}
rb_io_check_closed(fptr);
clearerr(fptr->f);
return Qtrue;
}