파일 열고 닫기

파일 열고 닫기 (Opening and Closing Files)

파일에서 데이터를 읽으려면 먼저 읽기 모드로 열어야 하고, 파일에 쓰려면 쓰기용으로 열어야 해요. fopen 함수는 읽거나 쓸 준비가 된 열린 파일의 포인터를 돌려주죠. 열린 파일에서 데이터를 다 읽거나 썼으면 닫아야 하는데, 그 역할을 fclose가 해요. 아래 코드는 파일에 쓰는 기본 패턴을 보여주는데, 파일을 읽을 때도 아주 비슷한 패턴을 써요.

filename = "myfile.txt";
fid = fopen (filename, "w");
# Do the actual I/O here...
fclose (fid);

출처: Opening and Closing Files

본문

fopen

fid = fopen (name)
fid = fopen (name, mode)
fid = fopen (name, mode, arch)
fid = fopen (name, mode, arch, encoding)
[fid, msg] = fopen (…)
fid_list = fopen ("all")
[file, mode, arch, encoding] = fopen (fid)

저수준 입출력을 위해 파일을 열거나, 열린 파일과 파일 디스크립터를 조회합니다.

fopen의 첫 번째 형태는 지정한 mode(읽기·쓰기 등), 아키텍처 해석(IEEE big endian, IEEE little endian 등), 파일 인코딩으로 이름이 name인 파일을 열고, 나중에 그 파일을 가리키는 데 쓸 정수 값을 돌려줘요. 오류가 발생하면 fid는 -1로 설정되고 msg에 해당 시스템 오류 메시지가 들어갑니다. mode는 파일을 읽기·쓰기·둘 다 중 어떤 용도로 열지 지정하는 한두 글자짜리 문자열이에요. encoding은 유효한 인코딩 식별자를 담은 문자열로, 파일에서 문자열을 읽거나 쓸 때 사용됩니다. 기본값은 UTF-8이에요.

두 번째 형태는 stdin, stdout, stderr 스트림을 제외한 현재 열려 있는 모든 파일에 해당하는 파일 ID 벡터를 돌려줍니다.

세 번째 형태는 파일 ID가 주어졌을 때 열린 파일에 대한 정보를 돌려줍니다.

예를 들어:

myfile = fopen ("splat.dat", "r", "ieee-le");

는 읽기용으로 splat.dat 파일을 엽니다. 필요하면 이진 숫자 값이 최하위 비트가 먼저 오는 IEEE 754 형식으로 저장돼 있다고 가정하고 읽은 뒤, 네이티브 표현으로 변환돼요.

이미 열려 있는 파일을 여는 것은 단순히 다시 열어서 별도의 파일 ID를 돌려주는 것뿐이에요. 파일을 여러 번 여는 건 오류가 아니지만, 여러 파일 ID를 통해 같은 파일에 쓰면 예상치 못한 결과가 나올 수 있어요.

mode의 가능한 값은:

  • 'r'(기본값) — 읽기용으로 파일을 엽니다.
  • 'w' — 쓰기용으로 파일을 엽니다. 이전 내용은 버려져요.
  • 'a' — 파일 끝에 쓰기용으로 엽니다(없으면 만듭니다).
  • 'r+' — 읽기·쓰기용으로 기존 파일을 엽니다.
  • 'w+' — 읽기·쓰기용으로 파일을 엽니다. 이전 내용은 버려져요.
  • 'a+' — 파일 끝에서 읽기·쓰기용으로 엽니다(없으면 만듭니다).

mode 문자열에 "t"를 붙이면 텍스트 모드로, "b"를 붙이면 이진 모드로 파일을 열어요. Windows 시스템에서 텍스트 모드 읽기·쓰기는 줄바꿈을 시스템에 맞는 줄 끝 문자(Windows에서는 캐리지 리턴+줄바꿈)로 자동 변환합니다. 모드를 지정하지 않으면 기본값은 이진 모드예요.

추가로 mode 문자열에 "z"를 붙이면 gzip으로 압축된 파일을 읽기·쓰기용으로 열 수 있어요. 이게 성공하려면 그 파일을 이진 모드로 열어야 합니다.

파라미터 arch는 파일의 기본 데이터 형식을 지정하는 문자열이에요. arch의 유효한 값:

  • "native" 또는 "n"(기본값) — 현재 머신의 형식.
  • "ieee-be" 또는 "b" — IEEE big endian 형식.
  • "ieee-le" 또는 "l" — IEEE little endian 형식.

아직 존재하지 않는 새 파일을 열 때 권한은 0666 - umask로 설정됩니다.

Compatibility Note: Octave는 버퍼링된 입출력을 사용해 파일을 열어요. 작은 쓰기가 내부 버퍼가 채워질 때까지 쌓였다가, 한 번의 연산으로 모두 쓰여져요. 이 방식은 매우 효율적이고 성능을 높여줘요. 반면 MATLAB은 모든 쓰기 연산이 즉시 수행되는 플러시 방식(flushed I/O)으로 파일을 엽니다. 데이터를 쓴 직후 쓰기가 즉시 수행돼야 한다면 fflush를 호출해서 내부 버퍼를 비워야 해요.

See also: fclose, fgets, fgetl, fscanf, fread, fputs, fdisp, fprintf, fwrite, fskipl, fseek, frewind, ftell, feof, ferror, fclear, fflush, freport, umask.

fclose

status = fclose (fid)
status = fclose ("all")

파일 디스크립터 fid가 가리키는 파일을 닫습니다. 성공하면 fclose는 0을, 그렇지 않으면 -1을 돌려줍니다. fclose 호출의 두 번째 형태는 stdin, stdout, stderr, 그리고 gnuplot과 연관된 FID를 제외한 모든 열린 파일을 닫습니다.

See also: fopen, fflush, freport.

is_valid_file_id

tf = is_valid_file_id (fid)

fid가 열린 파일을 가리키면 참을 돌려줍니다.

See also: freport, fopen.

더 알아보기

  • octave-simple-file-io — 간단한 파일 입출력
  • octave-file-positioning — 파일 포인터 위치 다루기