2015-11-04 77 views
1

我無法將哈希值的內容輸出到文件。該程序管理學生記錄列表,包括他們的StudentID,名字,姓氏,專業和目錄年份。一旦用戶完成添加記錄,它將被添加到散列中。將哈希值輸出到文本文件

除了當我嘗試運行quit_program函數時,程序中的所有內容都完美無缺,它不會保存文件中的內容。另外,我沒有收到任何錯誤,有什麼想法?

它可能不會工作,因爲它在將我的散列(文本數字)中的文本轉換爲文本文件時遇到問題?

def quit_program() 

puts "Save Changes? y/n" 

@changes = gets().chomp 

if @changes=="y" 


    @fh=File.open(@file_name, 'w') 
    @this_string="" 

    @sDB.each do |key, store_account_data| #line 50 

    puts "#{key}: #{store_account_data.join(',')}" 
    end 
    end 

@fh.puts(@this_string) 
@fh.close()  

end 
+1

歡迎來到Stack Overflow。請重新閱讀您的問題,並查看是否難以解析,因爲您的語法,大小寫和格式不符合他們的要求。考慮一下:閱讀越困難,我們理解它的時間越長,並且把問題放到你的問題的時間越少,我們可能花費的時間就越少。我建議重新編輯你的問題,改進語法和大小寫和格式。 –

+0

發佈源代碼的全部內容,或指向要點,hackpad等的鏈接(例如https://hastebin.com) –

+0

請勿粘貼代碼的「全部內容」或使用鏈接。堆棧溢出要求在問題本身*中展示問題所需的最小代碼*。鏈接使得這個問題對於未來的搜索者來說毫無價值,他們浪費我們的時間不得不追逐它們來查看代碼。 –

回答

1

你沒有寫任何文件。字符串@this_string是空的。你應該這樣做

@sDB.each do |key, store_account_data| 
    @fh.puts "#{key}: #{store_account_data.join(',')}" 
end 
+0

感謝您花時間回覆:) – matthewarnold

1

答案在錯誤信息中給出:undefined local variable or method 'sDB'(你已經從你的問題中刪除,使編輯後的版本無法回答。)你的程序中何時何地定義了sDB?初始化之前,您顯然嘗試退出。

無論如何,在其他方法中直接訪問實例變量並不是一件好事。你應該使用accessor(getter和setter)方法。這可能會阻止這種情況從頭到尾咬你。

def sdb 
    @sDB ||= Hash.new 
end 

def sdb=(key, value) 
    sdb 
    @sDB[ key ] = value 
end 
. . . 

即使定義了@sDB,也沒有正確寫入文件。例如,請參閱Ruby - Printing a hash to txt file

+0

這非常有幫助,謝謝! – matthewarnold

1

它不保存文件中的內容。

下面是不是你寫一個文件:

puts "#{key}: #{store_account_data.join(',')}" 

那你是怎麼寫信給你的終端/控制檯窗口。

而這種代碼:

@this_string="" 

@fh.puts(@this_string) 

一個空字符串寫入文件。

下面是如何寫入一個文件:

class Student 

    def initialize(sDB, filename) 
    @sDB = sDB 
    @filename = filename 
    end 

    def save_changes() 
    puts "Save Changes? y/n" 
    user_answer = gets().chomp 

    if user_answer == "y" 

     File.open(@file_name, 'w') do |f| 
     @sDB.each do |key, store_account_data| #line 50 
      f.puts "#{key}: #{store_account_data.join(',')}" 
     end 
     end 

    end 

end 

可以將其潛在的無法工作,因爲它是有麻煩 在我的哈希,這是字母數字的文本轉換成文本 文件?

號下面是一個具體的例子,你可以嘗試:

data = { 
    "John" => ['a', 123, 'b', 456], 
    "Sally" => ['c', 789, 'b', 0] 
} 

File.open('data.txt', 'w') do |f| 
    data.each do |name, data| 
    f.puts "#{name}: #{data.join(',')}" 
    end 
end 

$ ruby myprog.rb 
$ cat data.txt 
John: a,123,b,456 
Sally: c,789,b,0 

此外,紅寶石縮進爲2個空格 - 不爲0的空間或3位,或其他任何東西。

+0

另外,變量是Ruby中的snake_case,而不是camelCase,所以'@ sDB'需要修復。 –

+0

我很欣賞這個能量,謝謝! – matthewarnold

1

您的問題缺少必要的輸入數據,因此無法測試我們建議的更改。

這裏是未經測試的代碼我的工作範圍:

def quit_program 
    puts "Save Changes? y/n" 
    if gets.chomp.downcase == 'y' 
    File.write(
     @file_name, 
     @s_db.map{ |k, v| "#{ k }: #{ v.join(',') }" }.join("\n") 
    ) 
    end 
end 

注:

  • @sDB是不是在Ruby的一個合適的變量名。我們使用snake_case,而不是用於變量和方法名稱的camelCase。 ItsAMatterOfReadability。遵守公約或在您第一次進行代碼審查時遭受團隊成員的憤怒。
  • 不要在方法名稱(quit_program())或調用(gets())上添加空的括號,除非必須告訴變量和方法調用之間的區別。您也不應該將變量命名爲與方法相同,因爲它會混淆工作在代碼上的每個人,所以這絕不應該是一個考慮因素。
  • 不要創建一個變量(@changes)你只用一次就扔掉,除非你正在做的事情太複雜了,你需要將操作分解成更小的塊。而且,如果你這樣做,它將成爲重構成單獨方法的一個非常好的候選者,所以再次,不要。
  • 將用戶輸入與您期望的內容進行比較時,將其輸入的大小寫與您所期望的相匹配。 (gets.chomp.downcase == 'y')。它真的激怒了用戶輸入「y」,並因爲你堅持「Y」而失敗。
  • 雖然你可以使用File.open來創建或寫入文件,但使用File.write的視覺噪聲較少。 open非常棒,當你需要使用模式的各種選項,但純文本write就足夠了。
  • 用於寫入的整個塊看起來像它可以清理到單個mapjoin,它將數據強制轉換爲字符串數組,然後將其轉換爲單個字符串。
+0

這很好,謝謝你! – matthewarnold