C fopen vs open


리눅스 수업에서 둘 다 배우긴 했는데 open은 시험에만 나오고 실제로는 한 번도 써 본적 없습니다.

둘 다 파일을 열수 있는데 다른 코드를 봐도 파일은 다 fopen만 써요. 왜 그런거죠?

  1. FILE *fdopen(int fd, const char *mode);
  2. FILE *fopen(const char *path, const char *mode);
  3. int open(const char *pathname, int flags, mode_t mode);
  • 2016년 02월 02일에 작성됨

조회수 242


2 답변


좋아요
0
싫어요
채택취소하기

다음 이유 때문에 fopen이 open보다 자주 쓰입니다.

  1. fopen은 bufferd-IO를 기본으로 하기 때문에 open()보다 빠릅니다.
  2. fopen은 파일을 개행을 문자를 처리해주기 때문에 unix외의 플랫폼에서 쓰기 쉽습니다(binary모드는 제외)
  3. FILE *은 fscanf나 다른 stdio 함수를 쓰기 편합니다
  4. open()은 ANSI 표준이 아니기 때문에 특정 플랫폼에서는 쓸 수 없습니다.

보통은 주로 1, 2번이유때문에 fopen()을 선호합니다.

그치만 buffered-IO는 프로그래머가 생각지도 못한 결과를 낼수도 있기 때문에(특히 multithreading이나 seek등) 적당히 fflush()해주시고 마지막에 fclose()를 꼭 써주세요

  • 2016년 02월 02일에 작성됨


  1. open은 POSIX를 따르는 운영체제의 시스템 콜이고, fopen은 ANSI-C를 따라는 컴파일러의 표준 함수입니다.

  2. open은 POSIX 규격에 호환성이 있는데, 모든 운영체제가 POSIX규격을 따르지는 않습니다. fopen은 ANSI-C 규격에 호환성이 있습니다. 대부분의 C 컴파일러는 ANSI-C 표준을 따르는 편입니다. 따라서 호환성 측면에서 fopen이 더 좋습니다.

  3. fopen 의 구현의 경우 내부적으로 운영체제에서 제공하는 open 혹은 이에 대응대는 시스템 콜을 호출합니다. 따라서 @박단엽 말씀과 달리 fopen이 open보다는 빠르다고 말하기는 어렵겠습니다. (이부분에 오해의 여지가 있어 답변을 추가했습니다. @박단엽님 기분나빠하지는 말아주세요 )

마지막으로 정리하지면 open은 저수준 API라고 생각하시면 되고, fopen은 고급수준(프로그래머에게 편리한)의 API라고 생각하시면 될 것 같습니다. 호환성을 생각한다면, fopen을 쓰는 것이 좋을 것이고, 버퍼 관리 등의 I/O의 성능 향상 등의 목적을 꾀하려면 open을 직접 사용하는게 좋을 것 같습니다.

  • 2016년 03월 29일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close