2012-07-31 53 views
0

創建文件並填充數據後,在關閉之前,需要讀取零件數據,並且計算校驗和 。問題是您在關閉文件之前無法讀取數據。代碼 的代碼片段如下。寫入後讀取文件的一部分

我的問題是如何創建文件,寫入數據,讀取文件的一部分,然後關閉它?一個 可能的解決方案是在寫入文件之前使用緩衝區,但如果 文件很大,比如MB,GB,TB,PB,則不太方便。

begin 
    File.open(@f_name,"w+") do |file| 

    @f_old_size.times do 
     file.write "1" 
    end 

    file.flush 
    file.sync 

    ################# 
    # read file fails 
    # before close 
    ################# 
    while line = file.gets 
     puts line 
    end 

    end 
    rescue => err 
    puts "Exception: #{err}" 
    end 

    ##################### 
    # read file successfully 
    # after close it 
    ##################### 
    File.open(@f_name,"r") do |file| 
    line = file.gets 
    puts line 
    end 
+0

我不知道Ruby,但那些看起來像正常的stdio'fopen'標誌..而不是使用'w',爲什麼不使用'a'來打開文件以追加(讀寫)? – paddy 2012-07-31 23:44:14

+0

在紅寶石中,「a」模式不可讀 – SecureFish 2012-08-01 01:28:42

+0

文件在讀取或寫入時通常處於鎖定狀態。儘管很棘手,但很容易出錯,並且不被認爲是好的做法,所以可以立即從文件讀取/寫入。 – lyonsinbeta 2012-08-01 04:00:28

回答

1

你正在運行到的問題是,Ruby IO通過讀取該文件,並跟蹤該文件中它是。寫出數據後,IO對象的「查找頭」位於文件的底部。當你問下一行時,因爲它在底部,你什麼都沒有得到。

如果你改變你的代碼,包括file.rewind正因爲如此,它的工作原理:

################# 
# read file fails 
# before close 
################# 
file.rewind # <-- THIS IS THE ADDED LINE 
while line = file.gets 
    puts line 
end 

#rewind方法將「尋求頭」迴文件,一開始這是你在找什麼去做。