gets — 채널에서 한 줄 읽기

gets — 채널에서 한 줄 읽기

파일이나 stdin 같은 채널에서 한 줄씩 읽고 싶을 때 gets를 써요. 줄바꿈 문자는 버리고 실제 줄 내용만 가져오는 게 기본 동작이에요.

출처: Tcl Built-In Commands — gets

본문

시그니처

gets channelId ?varName?

getschannelId에서 다음 줄을 읽어요. 줄의 끝 줄바꿈 문자(들)까지가 아니라 그 앞까지의 내용을 반환하고, 줄바꿈 문자는 버려요.

channelId는 열려 있는 채널의 식별자여야 해요 — Tcl 표준 입력 채널(stdin), open이나 socket 호출의 반환값, 또는 Tcl 확장이 제공하는 채널 생성 명령어의 결과예요. 이때 채널은 입력용으로 열려 있어야 해요.

  • varName을 생략하면 줄 내용이 명령어의 결과로 반환돼요.
  • varName을 지정하면 줄 내용이 그 이름의 변수에 들어가고, 반환값은 읽은 문자 수예요.

파일 끝(end of file)에 도달하면 그 시점까지 읽을 수 있는 입력만 반환해요. channelId가 논블로킹 모드인데 완전한 줄이 아직 없으면 빈 문자열을 반환하고 입력을 소비하지 않아요. varName을 지정했는데 파일 끝이나 논블로킹 데이터 부족으로 빈 문자열이 들어가면 반환 개수는 -1이에요. varName을 지정하지 않으면, 파일 끝과 '완전한 줄 없음' 두 경우가 줄바꿈 문자만 있는 입력 줄과 같은 결과로 보일 수 있어요. 세 경우를 구분하려면 eoffblocked 명령어를 쓰면 돼요.

예제

파일을 한 줄씩 읽으면서 각 줄 앞에 줄 번호를 붙여 출력해요:

set chan [open "some.file.txt"]
set lineNumber 0
while {[gets $chan line] >= 0} {
    puts "[incr lineNumber]: $line"
}
close $chan

gets가 반환한 개수가 >= 0인 동안 루프를 도니까, 파일 끝에서 -1을 반환하면 자연스럽게 루프가 끝나요.

더 알아보기