2012-07-19 63 views
1

我還在學習ruby,所以我敢肯定我在這裏做錯了什麼,但在Windows上使用ruby 1.9.3,我有一個問題,寫一個隨機ascii垃圾文件是一個特定的大小。我需要能夠編寫這些文件在我正在QAing的應用程序上進行測試。在Mac和* nix上,每次都會正確寫入文件大小。但在Windows上,它會生成隨機大小的文件,通常介於1,024字節和1,031字節之間。Ruby文件寫入窗口返回錯誤的文件大小?

我敢肯定,問題是rstr正在生成的字符之一計算爲兩個字符,但是......似乎這不應該發生。

這裏是我的代碼:

num = 10 
k = 1 
for i in 1..num 
    fname = "f#{i}.txt" 
    f = File.new(fname, "w") 
    for k in 1..size 
    rstr = "#{(1..1024).map{rand(255).chr}.join}" 
    f.write rstr 
    print " #{rstr.size} " # this returns 1024 every time. 
    rstr = "" 
    end 
    f.close 
end 

也試過:

opts = {} 
    opts[:encoding] = "UTF-8" 
    fname = "f#{i}.txt" 
    f = File.new(fname, "w", opts) 

回答

2

默認情況下,在Windows中打開的文件打開爲文本模式這意味着行結束和其他細節被調整。

如果你想要的文件被寫入字節到字節完全按照你想要的,你需要在二進制模式打開文件:

File.new("foo", "wb") do |f| 
    # ... 
end 

b是POSIX操作系統上忽略,所以你的腳本現在是跨平臺兼容的。

注意:我使用塊語法來管理文件,以便在塊執行後正確關閉和配置文件處理程序。您不再需要擔心關閉文件;-)

希望這會有所幫助。

+0

Luis,這真是個訣竅,謝謝! – 2012-07-19 16:51:29

0

沒有任何255個ASCII。值從0到254。 如果您嘗試打印f 255.chr,您將得到一個多字節字符。由於Windows不標準utf-8,你會得到不正確的值。因此,你面臨的問題!

嘗試在文件頂部添加#coding: utf-8。它應該讓事情工作。

+0

實際上'size'應該返回相同的值,無論它分析單字節還是多字節字符。我想我錯了。 **編輯**:實際上,Ruby不會在Windows中使用標準的utf-8編碼。如果您在文件頂部添加#coding:utf-8,則應該正確。我會將其添加到答案中。 – 2012-07-19 15:40:34

+0

謝謝安德烈。儘管如此,仍然沒有工作。 :( – 2012-07-19 16:04:26