2011-08-17 4 views
0

을 처리 :이 코드에 직면 .I 루비 학습 책에있는 파일 문제

f = File.new("a.txt", "r") 
while a = f.getc 
    puts a.chr 
    f.seek(5, IO::SEEK_CUR) 
end 

저자는이 코드가 파일의 모든 다섯 번째 문자를 생산 씁니다을,하지만 난 왜 이해가 안 돼요? 나를 한 줄씩 설명 해주세요. 덕분에 .

+0

제 생각에는 '파일의 매 5 번째 문자'가 잘못되었습니다. f.getc를 사용하여 한 문자를 읽은 다음 5자를 건너 뜁니다. 그러면 다음 글을 읽으므로 각 여섯 번째 글자를 얻습니다. – knut

답변

3
f = File.new("a.txt", "r") 

이 줄은 파일을 읽기 모드로 열고 파일 개체 (I/O (입력/출력) 스트림)를 변수 f에 유지합니다.

while a = f.getc 

getc 한 번에 I/O 스트림의 한 문자를 가져 클래스 IO의 방법과는 I/O 스트림의 끝을 충족하는 경우는, nil을 줄 것이다 (File#new 참조). 따라서 while a = f.getc은 파일 끝까지 반복됩니다.

puts a.chr 

f.getc은 문자의 ASCII 값을 제공하고, ASCII 값에서 문자를 얻을 중위 것이다 (IO#getc 참조), 우리는 a.chr (Integer#chr 참조)에 적용됩니다. Ruby 1.9에서는 문자 자체를 getc의 출력으로 생각하지만 이전 버전에서는 ASCII 값을 출력으로 얻습니다. 첫 번째 getc 명령은 첫 번째 문자를 읽고 첫 번째 문자 다음에 I/O 스트림의 위치를 ​​이동합니다.

f.seek(5, IO::SEEK_CUR) 

seek 번째 파라미터와 상기 제 파라미터의 오프셋에 의해 I/O 스트림의 위치를 ​​변경하는 I/O 스트림을하는 방법이다. IO::SEEK_CUR은 I/O 스트림의 현재 위치를 알려주는 상수입니다. 따라서 f.seek(5, IO::SEEK_CUR)은 현재 위치에서 5 개 위치로 위치를 이동합니다. 루비의 falsey 값이 (falsenil은, 다른 모든 루비에서 유일하게 falsy 값이다 인, f.getcnil이되고, a = f.getc 파일의 끝에 여기에 거짓 조건을 (될 때까지

이 계속됩니다 (IO#seek 참조) 진리 값))

루비를 연구하고 실험하기 위해 IRB를 사용하십시오.

1

a = f.getc; puts a.chr은 단일 문자를 출력합니다. f.seek(5, IO::SEEK_CUR)은 앞으로 5 문자 씩 이동합니다.