seek — 열린 채널의 접근 위치 변경
seek — 열린 채널의 접근 위치 변경
파일을 읽다가 이미 지나간 부분을 다시 읽고 싶거나, 특정 위치에서부터 작업을 시작하고 싶을 때가 있어요. 그럴 때 쓰는 명령이 seek이에요. 채널 안에서 읽기/쓰기가 일어날 위치를 자유롭게 옮겨 다닐 수 있게 해 주죠.
출처: 문서
본문
문법
seek channelId offset ?origin?
동작 방식
seek은 channelId의 현재 접근 위치를 변경해요.
channelId는 열려 있는 채널의 식별자여야 해요. Tcl 표준 채널(stdin, stdout, stderr), open이나 socket의 반환값, 또는 Tcl 확장이 제공한 채널 생성 명령의 결과가 올 수 있어요.
offset과 origin 인자는 channelId에 대해 다음 읽기 또는 쓰기가 일어날 위치를 지정해요. offset은 정수여야 하고(음수도 가능), origin은 다음 중 하나여야 해요:
start— 새 접근 위치는 밑에 있는 파일이나 장치의 시작에서offset바이트 떨어진 곳이에요.current— 새 접근 위치는 현재 접근 위치에서offset바이트 떨어진 곳이에요. 음수 오프셋은 파일이나 장치 안에서 접근 위치를 뒤로 이동시켜요.end— 새 접근 위치는 파일이나 장치의 끝에서offset바이트 떨어진 곳이에요. 음수 오프셋은 파일 끝 앞에, 양수 오프셋은 파일 끝 뒤에 접근 위치를 놓아요.
origin 인자의 기본값은 start예요.
이 명령은 채널이 논블로킹 모드라도, 반환하기 전에 채널의 버퍼된 모든 출력을 비워요. 또 버퍼된 읽지 않은 입력도 모두 버리고요. 이 명령은 빈 문자열을 반환해요.
밑에 있는 파일이나 장치가 시킹(seek)을 지원하지 않는 채널에 이 명령을 적용하면 오류가 발생해요.
주의할 점: offset 값은 문자 오프셋이 아니라 바이트 오프셋이에요. read와 달리 seek과 tell은 모두 문자 단위가 아니라 바이트 단위로 동작해요.
예제
파일을 두 번 읽기:
set f [open file.txt]
set data1 [read $f]
seek $f 0
set data2 [read $f]
close $f
# 파일이 갱신되지 않았다면 $data1 eq $data2
파일의 마지막 10바이트 읽기:
set f [open file.data]
# 이 방법은 이진 데이터에는 확실히 동작하지만
# 다른 인코딩에서는 실패할 수 있음...
fconfigure $f -translation binary
seek $f -10 end
set data [read $f 10]
close $f
더 알아보기
file,open,close,gets,tellTcl_StandardChannels: 표준 채널 개념