[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를 사용할 때?



답변

첫째, fdopenif fopen가 옵션이고 open다른 가능한 선택 이라면 특별히 사용해야 할 이유가 없습니다 . open를 원한다면 처음에 파일을 여는 데 사용해서는 안됩니다 FILE *. 따라서 fdopen그 목록에 포함 시키는 것은 다른 것들과 크게 다르기 때문에 부정확하고 혼동됩니다. 여기서 중요한 차이점은 C 표준 FILE *과 OS 특정 파일 디스크립터 사이에 있기 때문에 무시하겠습니다 .

fopen대신에 4 가지 주요 이유가 있습니다 open.

  1. fopen는 버퍼링 IO를 제공하여 현재 수행하는 것보다 훨씬 빠를 수 있습니다 open.
  2. fopen 파일이 이진 모드로 열리지 않으면 줄 끝 변환을 수행합니다. 프로그램이 Unix 이외의 환경으로 이식 된 경우 세계가 LF 전용으로 수렴하는 것처럼 보이지만 (IETF 텍스트 기반 네트워킹 제외) SMTP 및 HTTP와 같은 프로토콜).
  3. A FILE *fscanf다른 stdio 기능 을 사용할 수있는 기능을 제공합니다 .
  4. 언젠가 코드는 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) fopenA는 라이브러리 함수 상태 openA는 시스템 콜 .

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);