3

ファイルから多数を取得し、それらを配列として保存して、それらを合計しようとしています。

nums = Array.new
x, total=0, 0
file = File.open("inputfile.txt", 'r')
while !file.eof?
  nums[x] = file.readline
  x+=1
end

while x>0
  x-=1
  total += nums[x]
end

puts total

コードを実行すると、次のようなエラーが表示されます。

String can't be coerced into Fixnum (TypeError)

各配列要素に実際に正しいデータが含まれていることを確認しました。数値は格納時に文字列と見なされると思います。その場合、配列を整数に変更して合計できるようにするにはどうすればよいですか?

4

3 に答える 3

4

修正するだけ

nums[x] = file.readline

nums[x] = file.readline.to_i

乾杯!

于 2013-05-22T02:11:19.867 に答える
1

開いているファイルを 1 行ずつ繰り返すことができます。

total = File.open("inputfile.txt").inject(0) { |sum, line| sum + line.to_i }

mapおよびを使用した squiguy からのコメントの例も参照してくださいreduce

于 2013-05-22T02:36:21.280 に答える
1

これが私がそれを行う方法です:

total = 0
File.foreach("inputfile.txt") { |li| total += li.to_i }
puts total

コードが合計を計算する前に使用可能なメモリがいっぱいになる可能性があるため、大きな配列をメモリに格納することはお勧めできません。代わりに、ファイルを 1 行ずつ読み取り、その都度計算してください。

ベンチマークによると、行ごとの I/O は、ファイル全体をメモリに読み込んでから単一行として処理しようとするのと同じくらい高速であるため、より保守的な方法を使用するIO.foreachios.each_line、不必要にメモリをいっぱいにしないようにしてください。

于 2013-05-22T04:25:13.060 に答える