1. 程式人生 > Ruby 程式語言入門 >21 Ruby 的 I/O

21 Ruby 的 I/O

我們與計算機的各種互動叫做 I/O,比如我們使用鍵盤輸入文字、按下滑鼠,計算機給在螢幕中顯示我們打出文字,生成檔案等。互動的資料以字元/位元組流的形式傳送到程式或從程式傳送。本章節中我們為大家詳細講解在 Ruby 中的 I/O 物件。

1. I/O 物件

在 Ruby 中,I/O 物件包裝輸入/輸出流。常量STDINSTDOUTSTDERR指向包裝標準流的I/O物件。預設情況下,全域性變數$stdin$stdout$stderr指向它們各自的常量。儘管常量應始終指向預設流,但是可以覆蓋全域性變數以指向另一個 I/O 流(例如檔案)。

1.1 輸出

使用下面的方法可以將內容輸出到螢幕上:

1.1.1 puts

IO 物件可以通過 puts 進行寫入操作。

例項:

$stdout.puts 'Hello World'

#---- 輸出結果 ----
Hello World

另一種寫法是我們常用的簡易版本:

puts 'Hello World'

#---- 輸出結果 ----
Hello World

1.2 print

使用 print 也可以進行寫入操作。

print 'Hello World'

#---- 輸出結果 ----
Hello World

需要注意一點,putsprint 的區別是 puts 在結尾有一個換行符,而 print 沒有。

例項:

puts 'Hello '
puts 'World' #---- 輸出結果 ---- Hello World
print 'Hello '
print 'World'

#---- 輸出結果 ----
Hello World

1.3 p

p 相當於將puts列印的內容進行了to_s操作。

例項:

puts [1, 2, 3].to_s
p [1, 2, 3]

#---- 輸出結果 ----
[1, 2, 3]
[1, 2, 3]

1.2 輸入

我們使用 $stdin.gets 來讓使用者進行輸入操作。

例項:

a = $stdin.gets 
p a
             # 鍵盤輸入1

#---- 輸出結果 ----
1 "1\n"

當然我們也可以省略 $stdin,只使用 gets

2. 檔案操作

2.1 建立一個I/O物件

要建立一個新的 IO 物件,我們需要一個檔案描述符。這裡我們使用數值 1(stdout)。

io = IO.new(1)
io.puts 'hello world'

#---- 輸出結果 ----
hello world

2.1 讀取檔案

I/O 物件是 File 的父類,所以可以對檔案進行讀寫操作

讓我們建立一個檔案 123.txt,寫入三行文字。

sentence1
sentence2
sentence3

然後使用 pwd 查詢到它的絕對地址目錄後。使用 IO.sysopen 並按照下面的程式碼進行讀取操作。

a = IO.sysopen '/Users/Andrew/Desktop/123.txt'
p a
lorem = IO.new(a)
p lorem.gets

#---- 輸出結果 ----
7
"sentence1\n"

由此我們讀取了一行的資料,如果我們想繼續讀取,就要繼續使用 gets

a = IO.sysopen '/Users/Andrew/Desktop/123.txt'
p a
lorem = IO.new(a)
p lorem.gets
p lorem.gets
p lorem.gets
p lorem.gets

#---- 輸出結果 ----
7
"sentence1\n"
"sentence2\n"
"sentence3\n"
nil

當我們讀到第四行的時候沒有資料了,會返回 nil

我們可以通過 eof? 判斷是否到達檔案末尾,使用 pos 來獲取游標位置,使用 rewind 將游標重置到頂部。

a = IO.sysopen '/Users/Andrew/Desktop/123.txt'
p a
lorem = IO.new(a)
p lorem.gets
p lorem.gets
p lorem.gets
p lorem.gets
p lorem.pos
p lorem.eof?
p lorem.rewind
p lorem.pos
p lorem.eof?

#---- 輸出結果 ----
7
"sentence1\n"
"sentence2\n"
"sentence3\n"
nil
30
true
0
0
false

2.2 寫入檔案

繼續上面檔案的操作,使用 puts 可以繼續寫入檔案。

a = IO.sysopen '/Users/Andrew/Desktop/123.txt', 'a'
p a
lorem = IO.new(a)
p lorem.puts "sentence4"
p lorem.puts "sentence5"

#---- 輸出結果 ----
7
nil
nil

執行後我們檢視 123.txt 檔案,發現檔案內容變更為:

sentence1
sentence2
sentence3
sentence4
sentence5

3. 小結

本章節中我們學習了 I/O 物件的輸出(puts、print、p)和輸入(gets),學習瞭如何建立一個 IO 物件來讀取檔案和寫入檔案。