[c] C fopen vs 오픈
당신이 사용하고 싶은 어떤 이유 (구문 적 이유가 아닌 것)가 있습니까?
FILE *fdopen(int fd, const char *mode);
또는
FILE *fopen(const char *path, const char *mode);
대신에
int open(const char *pathname, int flags, mode_t mode);
Linux 환경에서 C를 사용할 때?
답변
첫째, fdopen
if fopen
가 옵션이고 open
다른 가능한 선택 이라면 특별히 사용해야 할 이유가 없습니다 . open
를 원한다면 처음에 파일을 여는 데 사용해서는 안됩니다 FILE *
. 따라서 fdopen
그 목록에 포함 시키는 것은 다른 것들과 크게 다르기 때문에 부정확하고 혼동됩니다. 여기서 중요한 차이점은 C 표준 FILE *
과 OS 특정 파일 디스크립터 사이에 있기 때문에 무시하겠습니다 .
fopen
대신에 4 가지 주요 이유가 있습니다 open
.
fopen
는 버퍼링 IO를 제공하여 현재 수행하는 것보다 훨씬 빠를 수 있습니다open
.fopen
파일이 이진 모드로 열리지 않으면 줄 끝 변환을 수행합니다. 프로그램이 Unix 이외의 환경으로 이식 된 경우 세계가 LF 전용으로 수렴하는 것처럼 보이지만 (IETF 텍스트 기반 네트워킹 제외) SMTP 및 HTTP와 같은 프로토콜).- A
FILE *
는fscanf
다른 stdio 기능 을 사용할 수있는 기능을 제공합니다 . - 언젠가 코드는 ANSI C 만 지원하고
open
기능을 지원하지 않는 다른 플랫폼으로 이식해야 할 수도 있습니다 .
제 생각에는 줄 끝 번역이 당신을 도와주는 것보다 더 자주 당신의 길을 가고 있습니다 fscanf
.
그리고 C를 지원하는 대부분의 플랫폼에는 open
기능이 있습니다.
그것은 버퍼링 질문을 남깁니다. 주로 파일을 순차적으로 읽거나 쓰는 곳에서 버퍼링 지원은 실제로 유용하고 속도가 크게 향상됩니다. 그러나 파일에 데이터가있을 것으로 예상 할 때 데이터가 파일에 포함되지 않는 흥미로운 문제가 발생할 수 있습니다. 당신을 기억해야 fclose
또는 fflush
적절한 시간에.
탐색을 수행하는 경우 (일명 fsetpos
또는 fseek
두 번째는 표준 호환 방식으로 사용하기가 약간 까다 로움) 버퍼링의 유용성이 빠르게 떨어집니다.
물론 내 편견은 소켓을 많이 사용하는 경향이 있으며, FILE *
버퍼링 을 전혀 사용하지 않고 비 차단 IO ( 합리적으로 지원하지 못함)를 실제로하고 싶다는 사실이 있습니다. 복잡한 파싱 요구 사항이 실제로 내 인식을 채색합니다.
답변
open()
저수준 OS 호출입니다. fdopen()
os 레벨 파일 디스크립터를 C 언어의 상위 레벨 FILE-abstraction으로 변환합니다. 백그라운드에서 fopen()
호출 open()
하고 FILE 포인터를 직접 제공합니다.
원시 파일 디스크립터가 아닌 FILE 객체를 사용하면 몇 가지 장점이 있습니다. 여기에는 사용 편의성이 높지만 내장 버퍼링과 같은 다른 기술적 이점도 포함됩니다. 특히 버퍼링은 일반적으로 상당한 성능 이점을 제공합니다.
답변
fopen 대 C에서 열림
1) fopen
A는 라이브러리 함수 상태 open
A는 시스템 콜 .
2) fopen
제공 버퍼 IO 빠른 비교되어 open
있는은 비 버퍼 .
3) fopen
인 휴대 하면서 open
하지 포터블 ( 오픈 환경 특정 ).
4) FILE 구조 (FILE *)에fopen
대한 포인터를 반환합니다 . 파일을 식별하는 정수를 반환합니다. open
5) A FILE *
는 fscanf 및 기타 stdio 기능 을 사용할 수있는 기능을 제공합니다 .
답변
사용 open
이 실제 성능 이점 인 응용 프로그램의 0.1 %에 속하지 않는 한 실제로 사용하지 않는 좋은 이유는 없습니다 fopen
. 멀리는 다음과 같이 fdopen
우려는 파일 기술자와 함께 연주하지 않는 경우, 당신은 전화를 필요가 없습니다.
스틱 fopen
및 방법의 제품군 ( fwrite
, fread
, fprintf
, 등) 그리고 당신은 매우 만족됩니다. 마찬가지로 다른 프로그래머도 코드에 만족할 것입니다.
답변
당신이있는 경우 FILE *
, 당신은 같은 기능을 사용할 수 있습니다 fscanf
, fprintf
그리고 fgets
당신은 그냥 파일 설명이있는 경우, 입력 및 출력 루틴 제한 (하지만 가능성이 더 빨리) 한 등 read
, write
등
답변
공개, 읽기, 쓰기를 사용하면 신호 혼입에 대해 걱정해야합니다.
신호 핸들러에 의해 호출이 중단 된 경우, 함수는 -1을 리턴하고 errno를 EINTR로 설정합니다.
따라서 파일을 닫는 올바른 방법은
while (retval = close(fd), retval == -1 && ernno == EINTR) ;
답변
open()
시스템 호출이며 Unix 기반 시스템에 고유하며 파일 디스크립터를 리턴합니다. write()
다른 시스템 호출 인 파일 디스크립터에 쓸 수 있습니다 .
fopen()
파일 포인터를 반환하는 ANSI C 함수 호출이며 다른 OS로 이식 가능합니다. 를 사용하여 파일 포인터에 쓸 수 있습니다 fprintf
.
유닉스에서 : 다음을
사용하여 파일 디스크립터에서 파일 포인터를 얻을 수 있습니다.
fP = fdopen(fD, "a");
다음을 사용하여 파일 포인터에서 파일 설명자를 얻을 수 있습니다.
fD = fileno (fP);