- ベストアンサー
前の質問の住所の追加について。
回答を頂いてやってみたんですが、プログラムを実行して表示された結果は追加出来ているんですが、テキストファイルを開くと追加されていませんでした。 実行したプログラムがテキストファイルにも反映するにはどうしたら良いのでしょうか?? よろしく、お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>syntax error, unexpected $end, expecting kEND >obj.save >^ >と表示されました。 >これを、解決するにはどうしたらよいのでしょうか? どこでendの対応がずれてしまっています。 こちらで、実行して正常に動作したスクリプトを張りますので、 違いを確認してください。(endの対応にずれがないか確認してください) windows-7 ruby 1.9.2p180 (2011-02-18) [i386-mingw32] で動作確認済みです。 ------------------------------------------------- # coding:WINDOWS-31J class AddressFile def initialize(file) @original = file @meibo = {} fo = open("address_list.txt", "r") lines = fo.readlines fo.close for aLine in lines data = aLine.split @meibo[data[0]] = data[1] end end attr_accessor :meibo def search(name) @meibo[name] end def add(name,address) @meibo[name] = address end def save open(@original,"w") do |io| @meibo.each do |key,value| io.print "#{key} #{value}\n" end end end end obj = AddressFile.new("address_list.txt") obj.add("一郎", "一郎の住所") obj.add("次郎", "次郎の住所") obj.add("三郎", "三郎の住所") p obj.search("一郎") p obj.search("山田") obj.save -------------------------------------------------- また、今後質問される場合は、動作環境(OSとrubyのバージョン) もかかれると、より正確な回答が期待できますので、それも 書かれることをお勧めします。
その他の回答 (2)
- tatsu99
- ベストアンサー率52% (391/751)
#1です。 >自分なりに考えてみたんですが、fileをopenして追加書き込みすれば良いのでしょうか?? 基本的にはそうです。 しかし、その方法の場合、fileを読み込んだ後に、新たに追加した住所と名前だけを出力することになり、 新たに追加したものを予めおぼえておく処理が必要になります。 その為、今回は、追加ではなく、fileをopenして、住所を全て書くようにします。 fileの内容は上書きされます。 追加するメソッドをsaveとすると、クラス内に以下の行を追加します。 ----------------------------------------------------- def save open(@original,"w") do |io| @meibo.each do |key,value| io.print "#{key} #{value}\n" end end end ------------------------------------------------------- 最後にこのメソッドを呼び出します。 obj.add("○○○○", "△△△△") obj.search("○○○○") obj.search("○○○○") obj.search("○○○○") obj.save() #この行を追加 ----------------------------------------------- 尚、この場合、失敗すると、"address_list.txt"の内容は全てなくなりますので、 事前に必ず、バックアップをとってから、実行してください。 このプログラムを実際の業務で使い場合は、 ファイルへ出力する際、"address_list.txt"を"address_list.txt.OLD"等のように リネームし、その後、"address_list.txt"へ出力するようにしたほうが安全です。 このリネームする機能も、saveメソッドへ、組み込んでも良いでしょう。 そうすれば、必ず、1世代前のファイルが残るので、運用上安全になります。 又、一点気になる点は、 ファイルを読み込むとき、 fo = open("address_list.txt", "r")としていますが、 fo = open(file, "r") としないのはなぜでしょうか? obj = AddressFile.new("address_list.txt") で、このクラスのインスタンスを作るとき、 住所のファイルは、"address_list.txt"です、とパラメータでわたしていますので、 パラメータで渡されたファイルを読み込むべきです。 もし、 obj = AddressFile.new("data.txt") した場合は、"data.txt"を読み込むべきですが、読み込むファイルは、"address_list.txt" になってしまいます。
お礼
教えていただきありがとうございます。 ところが、今度はエラーが出てしまいました。 syntax error, unexpected $end, expecting kEND obj.save ^ と表示されました。 これを、解決するにはどうしたらよいのでしょうか?
- tatsu99
- ベストアンサー率52% (391/751)
ファイルへ出力するメソッドを追加します。 そのメソッドで、 @meiboのハッシュに格納されているものを全て、ファイルへ出力するようにします。
お礼
また、お答え頂いてありがとうございます!
補足
自分なりに考えてみたんですが、fileをopenして追加書き込みすれば良いのでしょうか??
お礼
無事うまくいきました! 自分の質問に何度も答えて頂いて本当に感謝しています! また、何かありましたらよろしくお願いします。