简体   繁体   中英

Having Trouble printing out .txt in ruby, ruby file handling

the problem is it cannot print all the text of the from a.txt file. I am able to print the first 3 lines of the txt file but not the rest. So far, I am getting an error which is in print_album': undefined local variable or method tracks' for main:Object (NameError).

Here's the code:

*I know using global variable is no good in Ruby but this exercise ask me to do it.

  module Genre
  POP, CLASSIC, JAZZ, ROCK = *1..4
  end

  $genre_names = ['Null', 'Pop', 'Classic', 'Jazz', 'Rock']

  class Album
  # NB: you will need to add tracks to the following and the initialize()
  attr_accessor :title, :artist, :genre, :tracks

  # complete the missing code:
  def initialize (atitle, aartist, agenre, arrtrk)
    # insert lines here
    @genre = agenre
    @tracks = arrtrk
    @title = atitle
    @artist = aartist

  end
end

   class Track
   attr_accessor :ttitle, :tlocation

  def initialize (tname, tloc)
    @ttitle = tname
    @tlocation = tloc
end
end

 # Reads in and returns a single track from the given file

 def read_track music_file

  mytrk_name = music_file.gets
  mytrk_location = music_file.gets
  mytrk = Track.new(mytrk_name, mytrk_location)
  mytrk

 end

 # Returns an array of tracks read from the given file

 def read_tracks music_file
 count = music_file.gets().to_i
 tracks = Array.new
 $i = 0
 # Put a loop here which increments an index to read the tracks
 while $i < count do
   track = read_track(music_file)
   tracks << track
   $i += 1
 end
 tracks
end

# Takes an array of tracks and prints them to the terminal

def print_tracks tracks
 # print all the tracks use: tracks[x] to access each track.
$i = 0
while $i < tracks.length do
    print_track(tracks[$i])
    $i +=1
end
tracks
end

# Reads in and returns a single album from the given file, with all its tracks

def read_album music_file

# read in all the Album's fields/attributes including all the tracks
# complete the missing code
album_title = music_file.gets
album_artist = music_file.gets
album_genre = music_file.gets.to_i

tracks = read_tracks(music_file)

album = Album.new(album_title, album_artist, album_genre, tracks)
album
end


# Takes a single album and prints it to the terminal along with all its tracks
def print_album album

# print out all the albums fields/attributes
# Complete the missing code.
 puts 'Album title is '+ album.title
 puts 'Artist is ' + album.artist
 puts 'Genre is ' + album.genre.to_s
 puts $genre_names[album.genre]
# print out the tracks
 print_tracks(tracks)
end

# Takes a single track and prints it to the terminal
def print_track track
 puts('Track title is: ' + track.ttitle)
 puts('Track file location is: ' + track.tlocation)
end

# Reads in an album from a file and then print the album to the terminal

def main
 music_file = File.new("album.txt", "r")
 album = read_album(music_file)
 music_file.close()

 print_album(album)
end

main

Here's is the album.txt

Greatest Hits
Neil Diamond
1
3
Crackling Rose
sounds/01-Cracklin-rose.wav
Soolaimon
sounds/06-Soolaimon.wav
Sweet Caroline
sounds/20-Sweet_Caroline.wav

Currently my output is:

Album title is Greatest Hits
Artist is Neil Diamond
Genre is 1
Pop

Expected output is:

Album title is Greatest Hits
Artist is Neil Diamond
Genre is 1
Pop
Track title is: Crackling Rose
Track file location is: sounds/01-Cracklin-rose.wav
Track title is: Soolaimon
Track file location is: sounds/06-Soolaimon.wav
Track title is: Sweet Caroline
Track file location is: sounds/20-Sweet_Caroline.wav

The problem is inside your def print_album album method. On the last line of the method it uses print_tracks(tracks) , but tracks variable is undefined (that's exactly what error tells you).

You need to call print_tracks(album.tracks)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM