페이지

2008년 10월 9일 목요일

fopen 옵션 정리

fopen의 파일 열기 옵션은 좀처럼 제대로 외우기가 쉽지 않다. 또한 모든 옵션별 차이점을 제대로 파악하기도 쉽지 않고... 일단 파악된 만큼 정리해 놓고... 추후 더 발견된 사항이 있으면 지속적으로 update해 나가는게 좋을 듯..

"r" : 읽기 전용 모드. 파일이 없으면 NULL return.
"w" :쓰기 전용 모드. 파일이 없으면 생성되고 있으면 내용이 없어진다.
"a" : append모드. 파일이 없으면 생성. 이미 존재하는 파일 끝부분에 file pointer가 위치하게 되며 이 위치부터 뒷쪽으로만 write가능. 읽기는 불가능. fseek등으로 이 부분보다 앞으로 file pointer를 이동시키면 어떻게 될까 ? 아래 내용으로 봐서는 fseek등으로 file pointer를 이동하여도 이와 상관없이 파일 끝부분에 write가 되는 것으로 생각됨.

Opening a file in append mode (a in the mode) causes all subsequent writes to the file to be forced to the current end-of-file, regardless of previous calls to the fseek() function.

"r+" : 읽고 쓰기 모드, 파일이 없으면 NULL return.
"w+" : 읽고 쓰기 모드 단, 파일이 없으면 만들고 있으면 기존 내용을 지움. write를 먼저 한 후 동일 파일 포인터로 읽기 수행이 필요한 경우 사용. 보통은 읽기 전용, 혹은 쓰기 전용으로 fopen하므로 w+가 필요한 일은 별로 없을 듯.
"a+" : append모드, 읽고 쓰기 가능. 파일이 이미 존재할 경우 그 파일의 끝부분에서부터 추가된 내용을 쓴다. 읽기는 fseek로 지정한 file pointer위치에서 가능하나 쓰기는 파일 끝부분에서만 가능.

When a file is opened with update mode (+ in the mode), both input and output may be performed on the associated stream

댓글 2개:

  1. "a" 나 "a+"는 결국 open 시스템 call로 구현시 O_APPEND flag를 통하여 설정되게 되는데, O_APPEND가 설정된 파일 디스크립터에 write 시스템 콜이 불리면 그 순간에 파일 오프셋의 현위치가 파일 마지막 위치로 이동한 후 write를 수행한다. 따라서 현 파일 오프셋의 위치에 상관없이 항상 file의 마지막 부분에 write되는 것이 보장된다.

    답글삭제
  2. 좋은글 잘 읽고 갑니다.
    마지막에 댓글 다신 부분(O_APPEND flag) 제 블로그에 참고, 인용하고 링크걸어 두었습니다. 문제가 되신다면 삭제하겠습니다.

    답글삭제