2011-01-21 7 views
19

私はコマンドラインプログラムを実行して、その行を出力してから、その行を一瞬後に更新しました。しかし、ルビーでは、私は行を出力してから別の行を出力するように見えます。コマンドプロンプトで先に出力された行をrubyで書き出す

Downloading file: 
11MB 294K/s 
12MB 307K/s 
14MB 294K/s 
15MB 301K/s 
16MB 300K/s 
Done! 

、代わりに、私はこれを見たい:

Downloading file: 
16MB 300K/s 
Done! 

行を:

Downloading file: 
11MB 294K/s 

は一瞬、この後に続くが、私は今、出力されている何

ダウンロードされたファイルサイズと転送速度がリストの代わりに毎回上書きされることを示す私のルビースクリプトの出力更新された値をまったく新しい行にします。

私は現在、出力を生成するためにputsを使用していますが、これは明らかにこのケース用に設計されていません。この結果を達成する別の出力方法はありますか?

答えて

38

\rを使用して、カーソルを行の先頭に移動します。 putsには\nが追加されているので、代わりにprintを使用してください。このように:

print "11MB 294K/s" 
print "\r" 
print "12MB 307K/s" 

しかし心に留めておくべき一つのこと:(\r何も削除しない、それだけで戻ってカーソルを移動し、あなたが以前の出力を上書きするスペースでパッドへの出力が必要になりますそれがもっと長い場合には)。

デフォルトでは\nが標準出力に出力されると、バッファはフラッシュされます。今すぐSTDOUT.flushprintの後に使用して、テキストがすぐに印刷されるようにする必要があります。

+1

この解決策は、改行が出力されるか、プログラムが終了するまで出力を表示しません。この例は、例えば 'print '123'; sleep 5; "\ r"を印刷します。 print "456"は最初に何も印刷せず、5秒後に "456"を出力します。だから、それは私を助けてくれません。 –

+1

'STDOUT.flush'を追加してすぐに出力に送ります。私も答えを更新しました。 – detunized

+0

ああ、意味があります。それは固定されており、今は素晴らしい仕事です、ありがとう! –

関連する問題