2011-08-17 36 views
0

。我面對這樣的代碼:處理的紅寶石學習書本文件問題

f = File.new("a.txt", "r") 
while a = f.getc 
    puts a.chr 
    f.seek(5, IO::SEEK_CUR) 
end 

作者寫道,該代碼產生的每個第五個字符的文件,但我不明白爲什麼?請逐行解釋我。 謝謝。

+0

在我看來,'文件中的每五個字符'都是錯誤的。使用f.getc可以讀取一個字符,然後跳過5個字符。然後你讀下一個...所以你得到每個第六個字符。 – knut

回答

3
f = File.new("a.txt", "r") 

這行打開在讀模式下的文件,並保持文件對象(作爲一個I/O(輸入/輸出)流)在變量f。 (參見File#new

while a = f.getc 

getc是類IO的方法,其在一個時間獲取I/O流中的一個字符,它會給nil,當滿足I/O流的末尾。所以while a = f.getc將循環直到文件結束。 (見IO#getc

puts a.chr 

f.getc會給字符的ASCII值和序來從ASCII值的字符,我們應用a.chr(見Integer#chr)。我認爲在Ruby 1.9中,我們會將字符本身作爲getc的輸出,但對於早期版本,我們將ASCII值作爲輸出。第一個getc命令讀取第一個字符,並在第一個字符後移動I/O流的位置。

f.seek(5, IO::SEEK_CUR) 

seek是I/O數據流的方法,該方法改變了I/O流的通過從所述第二參數中的第一參數的偏移量的位置。 IO::SEEK_CUR是一個常數,它給出了I/O流的當前位置。所以f.seek(5, IO::SEEK_CUR)將位置從當前位置移動到5個位置。 (見IO#seek

這將持續到a = f.getc成爲虛假的條件(在這裏文件的末尾,f.getc成爲nil,這是紅寶石(falsenil是在Ruby中唯一falsy值,所有其他人一個falsey值是真值))

使用IRB學習和試驗Ruby。

1

a = f.getc; puts a.chr輸出單個字符; f.seek(5, IO::SEEK_CUR)前進5個字符。