Project

General

Profile

Actions

Bug #10781

closed

stdout flushing and loops

Added by sneakin (Nolan Eakins) over 10 years ago. Updated over 10 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
[ruby-core:67794]

Description

I'm making a little program that has a shell like command prompt. Something like:

$ cmd
Cmd out
$ more
More out
$

I tried the following code, but the second prompt does not get flushed to my terminal after entering an initial command:

begin
  $stdout.write("$ ")
  $stdout.flush
 
  $stdout.puts($stdin.gets.inspect)
end until $stdin.closed? || $stdin.eof?

My output looks like:

$ input
"input\n"
more
$ "more\n"

But if I write my code like the following, my prompt works but I can't wrap my prompter in a method:

  $stdout.print('$ ')
  $stdout.flush
 
  begin
    $stdout.puts($stdin.gets.inspect)
    $stdout.print('$ ')
    $stdout.flush
  end until $stdin.closed? || $stdin.eof?
end

What exactly is the problem here? I've tried a 1.8 and 1.9.3p547.

Updated by sneakin (Nolan Eakins) over 10 years ago

Removing the $stdin.eof? call fixed my problem. IDK why as yet. I finally did find a page with a similar issue after seeing it was #eof? related at http://computer-programming-forum.com/39-ruby/0ce7591347ab1e27.htm

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

  • Description updated (diff)
  • Status changed from Open to Rejected

doc of IO#eof?:

If ios is a stream such as pipe or socket, IO#eof?
blocks until the other end sends some data or closes it.

This is true for a console device, and

Note that IO#eof? reads data to the input byte buffer.

Actions

Also available in: Atom PDF

Like0
Like0Like0