C fopen vs open

조회수 2267회

리눅스 수업에서 둘 다 배우긴 했는데 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);

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()를 꼭 써주세요

    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을 직접 사용하는게 좋을 것 같습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)