Go4Expert (http://www.go4expert.com/)
-   Ruby on Rails (http://www.go4expert.com/articles/ruby/)
-   -   Basic IO Operations in Ruby (http://www.go4expert.com/articles/basic-io-operations-ruby-t29246/)

asha 1Nov2012 18:02

Basic IO Operations in Ruby
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: 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}"


[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: Ruby


string = ''

while line = gets
        string = string + line

puts "Input was " + string.length.to_s + " character(s) long"


[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: Ruby


# open the file for reading
file_h = File.new("data.txt", "r")

# iterate till eof
while line = file_h.gets
    puts line

# close the filehandle

Now, let me list a few file handle iterators which are unique to Ruby in the next example.

Code: 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 }"

# 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: 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

Hope this was helpful, enjoy coding in Ruby.

All times are GMT +5.5. The time now is 14:22.