read — 채널에서 읽기

read — 채널에서 읽기

파일이든 소켓이든, 연결된 채널로부터 데이터를 한 번에 받아 오고 싶을 때 쓰는 명령이 바로 read예요. 전체를 통째로 읽을 수도 있고, 원하는 만큼의 문자 수를 지정해서 읽을 수도 있는 유연한 명령이죠.

출처: 문서

본문

문법

read ?-nonewline? channelId
read channelId numChars

동작 방식

첫 번째 형태에서 readchannelId로부터 파일 끝까지 모든 데이터를 읽어요. -nonewline 스위치가 지정되면 파일의 마지막 문자가 개행 문자일 때 그 문자를 버려요.

두 번째 형태에서는 추가 인자가 읽을 문자 수를 지정해요. 정확히 그만큼의 문자를 읽어서 반환하는데, 파일에 numChars보다 적은 문자가 남아 있다면 남은 문자를 모두 반환해요. 채널이 멀티바이트 인코딩을 사용하도록 설정되어 있다면 읽은 문자 수가 읽은 바이트 수와 같지 않을 수 있어요.

channelId는 열려 있는 채널의 식별자여야 해요. Tcl 표준 입력 채널(stdin), open이나 socket의 반환값, 또는 Tcl 확장이 제공한 채널 생성 명령의 결과가 올 수 있고, 입력용으로 열려 있어야 해요.

channelId가 논블로킹 모드라면, 명령은 요청한 만큼의 문자를 읽지 못할 수 있어요. 사용 가능한 입력을 모두 읽으면 더 많은 입력을 기다리며 블로킹하는 대신, 그 시점에 사용 가능한 데이터를 반환하게 돼요. 채널이 멀티바이트 인코딩을 사용한다면 내부 버퍼에 완전한 문자를 이루지 못하는 바이트가 남을 수 있는데, 그런 바이트는 완전한 문자가 되거나 파일 끝에 도달하기 전에는 반환되지 않아요. 명령이 파일 끝에 도달하기 전에 반환하면 -nonewline 스위치는 무시돼요.

read는 입력의 줄바꿈 시퀀스를 채널의 -translation 옵션에 따라 개행 문자로 번역해요. fconfigure가 입력을 어떻게 바꾸는지에 대한 자세한 내용은 fconfigure 매뉴얼 항목을 참고하세요.

직렬 포트와 함께 사용하기

대부분의 애플리케이션에서는 직렬 포트에 연결된 채널을 논블로킹으로 설정하는 게 좋아요: fconfigure channelId -blocking 0. 그러면 read는 위에서 설명한 것과 비슷하게 동작해요. 블로킹 직렬 포트에서 read를 사용할 때는 주의가 필요해요:

read channelId numChars

이 형태에서 read는 직렬 포트로부터 numChars를 받을 때까지 블로킹돼요.

read channelId

이 형태에서 read는 파일 끝 문자를 받을 때까지 블로킹돼요 (fconfigure -eofchar 참고). 채널에 파일 끝 문자가 설정되어 있지 않다면 read는 영원히 블로킹하게 돼요.

예제

이 예제는 파일을 한 번에 통째로 읽고 줄 단위로 나눠 리스트로 만드는 코드예요:

set fl [open /proc/meminfo]
set data [read $fl]
close $fl
set lines [split $data \n]

더 알아보기

  • file: 파일 다루기
  • eof, fblocked, fconfigure: 채널 상태와 설정
  • Tcl_StandardChannels: 표준 채널 개념