Basic IO Operations in Ruby

Discussion in 'Ruby on Rails' started by asha, Nov 1, 2012.

  1. asha

    asha New Member

    Joined:
    Nov 9, 2006
    Messages:
    44
    Likes Received:
    2
    Trophy Points:
    0
    Occupation:
    Homemaker
    Location:
    Kolkata
    Home Page:
    http://whatanindianrecipe.com
    Ruby is one of the growing scripting & web development language, it was designed to be easy to learn and provides least possible surprises for a newcomer to the language. Ruby on Rails is a very popular and robust MVC web framework. Ruby can also be used as CGI or can be inserted into Apache as module with the help of mod_ruby.

    Ruby comes in many variants, but let's leave the details of that for another day, in this article we'll discuss how the basic input/output operations such a reading from the terminal, file, writing out to a file etc. can be done in Ruby.

    Reading from STDIN



    Ruby has a built-in function gets() which reads a line from a file handle, in this case the STDIN. Now, let's look at a simple code which will read a line from the STDIN and print it.

    Code:
    #!/usr/bin/ruby
    
    # "print" because puts adds a trailing newline
    print "Enter your name: "
    # read a line into the variable name
    name = gets
    # print
    puts "Hello, #{name}"
    
    Output:
    Code:
    [pradeep@desktop]$ ./test.rb
    Enter your name: Pradeep
    Hello, Pradeep
    
    Let's look at another example where we'll ready the whole input line by line and print it's length.

    Code:
    #!/usr/bin/ruby
    
    string = ''
    
    while line = gets
            string = string + line
    end
    
    puts "Input was " + string.length.to_s + " character(s) long"
    
    Output:
    Code:
    [pradeep@desktop]$ ./test.rb
    The Quick Brown Fox Jumps Over The Lazy Dog
    Wow that was quick
    Input was 63 character(s) long
    [pradeep@desktop]$ ./test.rb < test.rb
    Input was 140 character(s) long
    

    Reading From A File



    The File object is contains the related operations for opening a file which returns the file handle object. Please follow the example below.

    Code:
    #!/usr/bin/ruby
    
    # open the file for reading
    file_h = File.new("data.txt", "r")
    
    # iterate till eof
    while line = file_h.gets
        puts line
    end
    
    # close the filehandle
    file_h.close
    
    Now, let me list a few file handle iterators which are unique to Ruby in the next example.

    Code:
    #!/usr/bin/ruby
    
    # open the file for reading
    file_h = File.new("data.txt", "r")
    
    # the each_byte method, reads character by character
    file_h.each_byte { |ch| putc ch }
    
    # the each_line method, reads line by line, default line separator is newline
    file_h.each_line { |line| puts "Read #{line.dump}" }
    
    # specify a different line separator
    file_h.each_line("|") do |line|
      puts "Read #{ line.dump }"
    end
    
    # reading a specific no. of bytes, say reading 16 bytes
    data = file_h.sysread(16)
    
    # read the whole file into an array
    file_array = IO.readlines("data.txt")
    

    Writing To A File



    Writing to files with Ruby can be more fun than other languages, I guess it's because everything in Ruby is an object. There are numerous methods available to write to a file like print, printf, puts, syswrite, etc. all are called on the file handle. But remember not to mix syswrite and other methods, as syswrite works on a system level and is unbuffered, else set the file handle to be unbuffered by default. Now, follow the example below.

    Code:
    #!/usr/bin/ruby
    
    # open the file for writing, you can also open it for appending with "a"
    # you may also specify the Unix file permissions for a new that would be created
    file_fh = File.new('data.txt','w+', 0644)
    
    # set the file handle to turn of buffering, i.e. it will immediately write to the file
    file_fh.sync = true
    
    # write with puts, it'll append a newline in the end
    file_fh.puts("My first line")
    
    # write with print, it'll not add a newline
    file_fh.print("Add with print")
    
    # to see that there wasn't any newline added
    file_fh.print("Add with another print")
    
    # write any arbitrary string with syswrite, syswrite is faster than other methods
    # it returns the number of bytes written
    puts file_fh.syswrite("Trying syswrite")
    
    # remember to close the file, specially in case of buffered mode so that
    # any unbuffered data is written to the disk
    file_fh.close
    
    Hope this was helpful, enjoy coding in Ruby.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice