Ruby File Handing, чтение и сохранение в виде массива - PullRequest
0 голосов
/ 27 октября 2018

Я не могу понять, как работает этот фрагмент кода, программа может прочитать файл, но в итоге несколько раз печатает одну и ту же строку.

Выход:

Track title is: c/music/1

Track file location is: c/music/1

Track title is: c/music/2 

Track file location is: c/music/2

Track title is: c/music/3

Track file location is: c/music/3

Ожидаемый результат:

Track title is: Taco

Track file location is: c/music/1

Track title is: Burrito 

Track file location is: c/music/2

Track title is: Nacho

Track file location is: c/music/3

Код:

class Track
    attr_accessor :title, :file_location
end

def read_tracks music_file

    count = music_file.gets().to_i
  tracks = Array.new
  $i = 0

  while $i < count do
  track = read_track(music_file)
  tracks << track
  $i += 1
  end
    tracks
end


def read_track aFile

  track_title = aFile.gets
  track_file_location = aFile.gets
  track = Track.new
  track.title = track_title
  track.file_location = track_file_location

end



def print_tracks tracks
  $i = 0
  while $i < tracks.length do
    print_track(tracks)
    $i += 1
  end

end


def print_track tracks
  puts('Track title is: ' + tracks[$i].to_s)
    puts('Track file location is: ' + tracks[$i].to_s)
end


def main
  aFile = File.new("input.txt", "r") 
  if aFile  
    tracks = read_tracks(aFile)
    aFile.close
  else
    puts "Unable to open file to read!"
  end

  print_tracks(tracks)
end

main

Пример входного файла:

5

Taco

c/music/1

Burrito

c/music/2

Nacho

c/music/3

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Попробуйте, копируя строки в массив, затем манипулируя им:

lines = File.readlines('tracks.txt') # reads lines into array
lines.reject! { |e| e == "\n" } # removes empti lines
total_tracks = lines.shift.chomp.to_i # extract the first line from the array
lines.each_slice(2) { |e| puts e } # lines now contains only the pair track/directory
# adapt at your will

Для each_slice(2) см. Enumerable # each_slice , он группирует элементы массива в группы.

0 голосов
/ 27 октября 2018

Проблема в методах print_tracks и print_track .
Эти методы должны выглядеть следующим образом:

def print_tracks tracks
  $i = 0
  while $i < tracks.length do
    print_track(tracks[$i])
    $i += 1
  end    
end


def print_track track
  puts('Track title is: ' + track.title.to_s)
    puts('Track file location is: ' + track.file_location.to_s)
end

Но если вы хотите улучшить свой код, попробуйте что-то вроде этого:

def print_tracks(tracks)
  tracks.each do |track|
    puts "Track title is: #{track.title}"
    puts "Track file location is: #{track.file_location}"
    puts
  end
end

В этом случае весь код будет:

class Track
  attr_accessor :title, :file_location
end

def read_tracks music_file
  count = music_file.gets().to_i
  tracks = Array.new
  i = 0

  while i < count do
    track = read_track(music_file)
    tracks << track
    i += 1
  end

  tracks
end

def read_track aFile
  track = Track.new
  track.title = aFile.gets
  track.file_location = aFile.gets
  track
end

def print_tracks(tracks)
  tracks.each do |track|
    puts "Track title is: #{track.title}"
    puts "Track file location is: #{track.file_location}"
    puts
  end
end

def main
  aFile = File.new("input.txt", "r").
  if aFile..
    tracks = read_tracks(aFile)
    aFile.close
  else
    puts "Unable to open file to read!"
  end

  print_tracks(tracks)
end

main

Я тестировал этот код, используя пример файла input.txt:

3
Taco
c/music/1
Burrito
c/music/2
Nacho
c/music/3

У меня есть вывод:

Track title is: Taco
Track file location is: c/music/1

Track title is: Burrito
Track file location is: c/music/2

Track title is: Nacho
Track file location is: c/music/3

Это именно то, что вы ожидали!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...