2011년 6월 2일 목요일

10.Basic Input and Output

10.Basic Input and Output

Kernel 모듈에는 입출력 관련된 메서드가 전부 구현되어 있다. 이 메서드들은 gets, open, print, printf, putc, puts, readline, readlines, test 등을로 루비 프로그램을 작성할 때 직관적으로 쓸수 있고 간편하다.

IO 객체란 무엇인가?
IO 객체는 루비 프로그램과 외부 리소스 사이의 양방향 채널 역할을 한다. IO 객체가 보기보다 복잡할 수도 있지만, 결국에는 IO 객체에서 읽고 IO 객체에서 쓰는 것이 전부다.

파일 열고 닫기
aFile = File.new("testfile", "r")
   # ... process the file
aFile.close

모 든 문자열에 따라 읽기모드 r, 쓰기모드 w, 읽기쓰기모드 rw로 File 객체를 생성할 수 있다. 파일을 생성할 때는 여기에 덧붙여 권한을 지정해 줄수도 있다. 파일 객체 사용후에는 객체를 닫아(close) 사용된 모든 버퍼가 저장되고 관련된 리소스들이 반환될 수 있도록 한다.

파일 읽고 쓰기
File.open("testfile") do |file|
   while line = gets
       puts line
   end
end

파일 객체에서도 기본적인 IO메서드를 모두 사용할 수 있다. gets 메서드가 표준 입력에서 한줄을 읽는 것처럼 file.gets는 file 객체에서 한 줄을 읽는다.

읽기를 위한 반복자
루비의 다양한 반복자를 활용할 수 있다.

IO#each_byte 메서드는 IO 객체로부터 8비트씩 읽어서 블록을 실행한다.
File = File.new("testfile")
aFile.each_byte {|ch| putc ch; putc ?. }

IO#each_line 메서드는 파일로부터 한 줄씩 읽어서 블록을 호출한다.
aFile.each_line {|line| puts "Got #{line.dump}" }

IO#foreach 메서드는 I/O대상의 이름을 매개변수로 받아서 읽기용으로 열고, 각 줄 별로 블록을 호출한 다음 자동으로 파일을 닫는다.
IO.foreach("testfile") { |line| puts line }

문자열로 읽기
str = IO.read("testfile")
str.length
str[0,30]

배열로 읽기
arr = IO.readlines("testfile")
arr.length
arr[0]

문자열로 I/O 하기
StringIO 객체는 다른 I/O 객체처럼 행동한다. 하지만 파일이 아니라 문자열로 부터 읽고 문자열에 쓴다는 차이점이 있다. StringIO 객체를 읽기용으로 사용하려면 문자열을 제공하여야 한다.

require 'stringio'
ip = StringIO.new("now is\nthe time\nto learn\nRuby!")
op = StringIO.new("","w")
ip.each_line do |line|
   op.puts line.reverse
end
op.string

네트워크와 대화하기
루비는 네트워크 개발을 위한 소켓 클래스를 제공하고 이 클래스들을 이용하면 TCP, UDP, SOCKS, 유닉스 도메인 소켓을 포함해서 아키텍처에서 제공하는 어떤 종류의 소켓에도 접근할 수 있다.

require 'socket'
client = TCPSocket.open('localhost', 'finger')
client.send("oracle\n", 0) # 0 means standard packet
puts client.readlines
client.close

고수준의 네트워킹가 관련해서는 lib/net의 라이브러리들이 여러 가지 어플리케이션 레벨의 프로토콜(FTP, HTTP, POP, SMTP, telnet 등)을 다루는 모듈을 제공한다.

require 'net/http'

h = Net::HTTP.new('www.pragmaticprogrammer.com', 80)
resp, data = h.get('/index.html', nil)
if resp.message == "OK"
data.scan(/<img src="(.*?)"/) { |x| puts x }
end

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...