Ruby 파일 입력 및 출력


Ruby는 커널 모듈에 구현된 완전한 I/O 관련 메서드 세트를 제공합니다. 모든 I/O 메서드는 IO 클래스에서 파생됩니다.

클래스 IOread, write, gets, puts, readline, getcprintf와 같은 모든 기본 메서드를 제공합니다.

이 장에서는 Ruby에서 사용할 수 있는 모든 기본 I/O 기능을 설명합니다. 더 많은 기능을 보려면 Ruby의 IO 클래스를 확인하세요.

puts

이전 장에서는 변수에 값을 할당한 다음 puts 문을 사용하여 출력을 인쇄했습니다.

puts 문은 프로그램에 변수에 저장된 값을 표시하도록 지시합니다. 이렇게 하면 각 줄 끝에 새 줄이 추가됩니다.

Example

#!/usr/bin/ruby

val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2

위 예제의 출력은 다음과 같습니다.

This is variable one
This is variable two

gets

gets 문은 STDIN이라는 표준 화면에서 사용자 입력을 가져오는 데 사용할 수 있습니다.

Example

아래 코드는 gets 문을 사용하는 방법을 보여줍니다. 이 코드는 사용자에게 값을 묻는 메시지를 표시합니다. 이 값은 val 변수에 저장되고 최종적으로 STDOUT에 인쇄됩니다.

#!/usr/bin/ruby

puts "Enter a value :"
val = gets
puts val

위 예제의 출력 결과는 다음과 같습니다.

Enter a value :
This is entered value
This is entered value

putc 문은

puts

문과 다릅니다. puts 문은 전체 문자열을 화면에 출력합니다. putc 문은 한 문자를 순차적으로 출력하는 데 사용할 수 있습니다. Example

다음 코드의 출력은 문자 H입니다.

#!/usr/bin/ruby

str="Hello Ruby!"
putc str

위 예제의 출력 결과는 다음과 같습니다.

H

print

print

문은 puts 문과 유사합니다. . 유일한 차이점은 puts 문은 내용을 출력한 후 다음 줄로 이동하는 반면, print 문을 사용할 때는 커서가 같은 줄에 위치한다는 것입니다. Example

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

위 예제의 출력은 다음과 같습니다.

Hello WorldGood Morning

파일 열기 및 닫기

지금까지 표준 입력 및 출력을 읽고 썼습니다. 이제 실제 데이터 파일을 조작하는 방법을 살펴보겠습니다.

File.new

메서드

File.new

메서드를 사용하여 읽기, 쓰기 또는 읽기 및 쓰기를 위한 File 개체를 만들 수 있습니다. 읽기 및 쓰기 권한은 모드 매개변수에 따라 다릅니다. 마지막으로 File.close 메서드를 사용하여 파일을 닫을 수 있습니다. Syntax

aFile = File.new("filename", "mode")
   # ... 处理文件
aFile.close

File.open

Method

File.open

메소드를 사용하여 새 파일 객체를 생성하고 파일 객체를 파일에 할당할 수 있습니다. 그러나 File.open 메서드와 File.new 메서드에는 약간의 차이가 있습니다. 차이점은 File.open 메서드는 블록과 연결할 수 있지만 File.new 메서드는 연결할 수 없다는 것입니다.

File.open("filename", "mode") do |aFile|
   # ... process the file
end
아래 표에는 파일을 여는 다양한 모드가 나열되어 있습니다.

ModeDescription
r읽기 전용 모드입니다. 파일 포인터는 파일의 시작 부분에 위치합니다. 이것이 기본 모드입니다.
r+읽기 및 쓰기 모드. 파일 포인터는 파일의 시작 부분에 위치합니다.
w쓰기 전용 모드입니다. 파일이 있으면 파일을 덮어씁니다. 파일이 없으면 쓰기용으로 새 파일이 생성됩니다.
w+읽기 및 쓰기 모드. 파일이 있으면 기존 파일을 덮어씁니다. 파일이 존재하지 않으면 읽기 및 쓰기를 위해 새 파일이 생성됩니다.
a쓰기 전용 모드입니다. 파일이 존재하는 경우 파일 포인터는 파일 끝에 배치됩니다. 즉, 파일이 추가 모드에 있습니다. 파일이 없으면 쓰기용으로 새 파일이 생성됩니다.
a+읽기 및 쓰기 모드. 파일이 존재하는 경우 파일 포인터는 파일 끝에 배치됩니다. 즉, 파일이 추가 모드에 있습니다. 파일이 존재하지 않으면 읽기 및 쓰기를 위해 새 파일이 생성됩니다.

파일 읽기 및 쓰기

간단한 I/O에 사용되는 메서드도 모든 파일 개체에 사용할 수 있습니다. 따라서 get은 표준 입력에서 한 줄을 읽고 aFile.gets는 파일 개체 aFile에서 한 줄을 읽습니다.

그러나 I/O 객체는 편의를 제공하기 위해 액세스 방법에 대한 추가 설정을 제공합니다.

sysread 메서드

sysread 메서드를 사용하여 파일의 내용을 읽을 수 있습니다. sysread 메서드를 사용하면 두 모드 중 하나로 파일을 열 수 있습니다. 예:

입력 텍스트 파일은 다음과 같습니다.

This is a simple text file for testing purpose.

이제 이 파일을 읽어 보겠습니다.

#!/usr/bin/ruby

aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   puts "Unable to open file!"
end

이 명령문은 파일의 처음 20자를 입력합니다. 파일 포인터는 파일의 문자 21에 배치됩니다.

syswrite 메서드

syswrite 메서드를 사용하여 콘텐츠를 파일에 쓸 수 있습니다. syswrite 메소드를 사용하는 경우 쓰기 모드에서 파일을 열어야 합니다. 예:

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
else
   puts "Unable to open file!"
end

이 명령문은 파일에 "ABCDEF"를 기록합니다.

each_byte 메소드

이 메소드는 File 클래스에 속합니다. each_byte 메소드는 문자열의 각 문자를 반복할 수 있는 메소드입니다. 아래 코드 예시를 참조하세요.

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
   aFile.rewind
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   puts "Unable to open file!"
end

문자는 ch 변수에 하나씩 전달된 후 아래와 같이 화면에 표시됩니다.

A.B.C.D.E.F.s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...

IO.readlines 메소드

classFile은 멤버입니다. 클래스 IO 하위 클래스. 클래스 IO에는 파일을 조작하는 방법도 있습니다.

IO.readlines은 IO 클래스의 메서드입니다. 이 메소드는 파일의 내용을 한 줄씩 반환합니다. 다음 코드는 IO.readlines 메소드의 사용을 보여줍니다.

#!/usr/bin/ruby

arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

이 코드에서 변수 arr은 배열입니다. input.txt 파일의 각 줄은 arr 배열의 요소가 됩니다. 따라서 arr[0]에는 파일의 첫 번째 줄이 포함되고 arr[1]에는 두 번째 줄이 포함됩니다.

IO.foreach 메서드

이 메서드도 출력을 한 줄씩 반환합니다. foreach 메소드와 readlines 메소드의 차이점은 foreach 메소드가 블록과 연관되어 있다는 것입니다. 그러나 readlines 메소드와 달리 foreach 메소드는 배열을 반환하지 않습니다. 예:

#!/usr/bin/ruby

IO.foreach("input.txt"){|block| puts block}

이 코드는 test 파일의 내용을 한 줄씩 변수 블록에 전달한 다음 출력이 화면에 표시됩니다.

파일 이름 바꾸기 및 삭제

renamedelete 메소드를 통해 파일 이름을 바꾸고 삭제할 수 있습니다.

다음 예에서는 기존 파일 test1.txt의 이름을 바꿉니다.

#!/usr/bin/ruby

# 重命名文件 test1.txt 为 test2.txt
File.rename( "test1.txt", "test2.txt" )

다음 예에서는 기존 파일 test2.txt을 삭제합니다.

#!/usr/bin/ruby

# 删除文件 test2.txt
File.delete("text2.txt")

파일 모드 및 소유권

마스크 chmod 메서드와 함께 사용하여 파일의 모드 또는 권한/액세스 목록:

다음 예에서는 기존 파일 test.txt의 모드를 마스크 값으로 변경합니다.

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )

다음 표에는 chmod 메서드가 나열되어 있습니다. 사용 가능한 다양한 마스크:

ㅋㅋㅋ w , 소유자용
0100x , for 소유자
0070rwx 마스크 , 소속 그룹용
0040r , 소속 그룹용
0020 w, 소속 그룹
0010x , 자신이 속한 그룹용
0007rwx 마스크 , 기타용
0004r , 기타용
0002 w , 다른 사람들을 위해
0001x, 기타
4000실행 시 사용자 ID 설정
2000실행 시 그룹 ID 설정
1000 사용 후에도 교환 문자를 저장하세요 저장합니다

파일 쿼리

다음 명령은 파일을 열기 전에 파일이 이미 존재하는지 확인합니다.

#!/usr/bin/ruby

File.open("file.rb") if File::exists?( "file.rb" )

다음 명령은 파일이 실제로 파일인지 확인합니다.

#!/usr/bin/ruby

# 返回 true 或false
File.file?( "text.txt" )

다음 명령은 주어진 파일 이름이 디렉터리인지 확인합니다.

#!/usr/bin/ruby

# 一个目录
File::directory?( "/usr/local/bin" ) # => true

# 一个文件
File::directory?( "file.rb" ) # => false

다음 명령은 파일이 읽기 가능하고, 쓰기 가능하고, 실행 가능한지 확인합니다.

#!/usr/bin/ruby

File.readable?( "test.txt" )   # => true
File.writable?( "test.txt" )   # => true
File.executable?( "test.txt" ) # => false

다음 명령은 파일 크기가 0인지 확인합니다.

#!/usr/bin/ruby

File.zero?( "test.txt" )      # => true

다음 명령은 파일 크기를 반환합니다.

#!/usr/bin/ruby

File.size?( "text.txt" )     # => 1002

다음 명령은 파일 유형 확인에 사용됩니다:

#!/usr/bin/ruby

File::ftype( "test.txt" )     # => file

ftype 메소드는 다음 값 중 하나를 반환하여 파일 유형을 식별합니다: file,directory,characterSpecial, blockSpecial, fifo, 링크, 소켓 또는 알 수 없음.

다음 명령은 파일이 생성되거나 수정되거나 마지막으로 액세스된 시기를 확인하는 데 사용됩니다.

#!/usr/bin/ruby

File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Ruby의 디렉터리

모든 파일은 디렉터리에 포함되어 있으며 Ruby는 파일과 디렉터리를 처리하는 방법을 제공합니다. File 클래스는 파일을 처리하는 데 사용되고 Dir 클래스는 디렉터리를 처리하는 데 사용됩니다.

디렉토리 찾아보기

Ruby 프로그램에서 디렉토리를 변경하려면 Dir.chdir을 사용하세요. 다음 예에서는 현재 디렉터리를 /usr/bin로 변경합니다.

Dir.chdir("/usr/bin")

Dir.pwd를 통해 현재 디렉터리를 볼 수 있습니다.

puts Dir.pwd # 返回当前目录,类似 /usr/bin

Dir.entries를 사용하여 지정된 디렉터리에 있는 파일 및 디렉터리 목록을 가져올 수 있습니다.

puts Dir.entries("/usr/bin").join(' ')

Dir.entries 디렉터리의 지정된 모든 항목을 포함하는 배열입니다. Dir.foreach는 동일한 기능을 제공합니다.

Dir.foreach("/usr/bin") do |entry|
   puts entry
end

디렉토리 목록을 얻는 더 간단한 방법은 Dir의 배열과 유사한 메서드를 사용하는 것입니다.

Dir["/usr/bin/*"]

Create Directory

Dir.mkdir를 사용하여 디렉터리를 만들 수 있습니다.

Dir.mkdir("mynewdir")

mkdir을 통해 (기존 디렉터리가 아닌) 새 디렉터리에 대한 권한을 설정할 수도 있습니다.

참고: Mask 755 Set owner, group, world [누구나 ])에는 rwxr-xr-x 권한이 있습니다. 여기서 r = 읽기, w = 쓰기, x = 실행.

Dir.mkdir( "mynewdir", 755 )

Delete Directory

Dir.delete를 사용하여 디렉토리를 삭제할 수 있습니다. Dir.unlinkDir.rmdir은 편의를 위해 동일한 기능을 수행합니다.

Dir.delete("testdir")

Creating Files & Temporary Directories

임시 파일이란 단순히 프로그램 실행 중에 생성되는 정보이지 영구적으로 저장되지 않는 정보입니다.

Dir.tmpdir은 현재 시스템의 임시 디렉터리 경로를 제공하지만 이 방법은 기본적으로 사용할 수 없습니다. Dir.tmpdir을 사용할 수 있게 하려면 필수 'tmpdir'을 사용해야 합니다.

File.join과 함께 Dir.tmpdir을 사용하여 플랫폼 독립적인 임시 파일을 만들 수 있습니다.

require 'tmpdir'
   tempfilename = File.join(Dir.tmpdir, "tingtong")
   tempfile = File.new(tempfilename, "w")
   tempfile.puts "This is a temporary file"
   tempfile.close
   File.delete(tempfilename)

이 코드는 임시 파일을 만들고 여기에 데이터를 쓴 다음 해당 문서를 삭제합니다. Ruby의 표준 라이브러리에는 임시 파일을 만드는 데 사용할 수 있는 Tempfile이라는 라이브러리도 포함되어 있습니다.

require 'tempfile'
   f = Tempfile.new('tingtong')
   f.puts "Hello"
   puts f.path
   f.close

내장 함수

파일 및 디렉터리 작업을 위해 Ruby에 내장된 함수의 전체 목록이 제공됩니다. 아래:

  • 파일 클래스 및 메서드.

  • Dir 클래스 및 메소드.