[c] 파일 설명자와 파일 포인터의 차이점은 무엇입니까?

파일 설명자와 파일 포인터의 차이점을 알고 싶습니다.

또한 어떤 시나리오에서 다른 것 대신 하나를 사용 하시겠습니까?



답변

파일 디스크립터는 Linux 및 기타 유닉스 계열 시스템에서 커널 수준에서 열린 파일 (또는 소켓 등)을 식별하는 데 사용되는 저수준 정수 “핸들”입니다.

당신은 같은 실제 유닉스 호출에 “알몸”파일 설명을 통과 read(), write()등등.

FILE포인터는 파일을 표현하는 데 사용되는 C 표준 라이브러리 수준의 구조입니다. 는 FILE파일 기술자를 래핑, 그리고 I / O를 쉽게하기 위해 버퍼링 및 기타 기능을 추가합니다.

당신은 통과 FILE같은 표준 C 함수에 대한 포인터를 fread()하고 fwrite().


답변

하나는 버퍼링되고 ( FILE *) 다른 하나는 버퍼링 되지 않습니다. 실제로, 당신은 FILE *당신이 무엇을하고 있는지 또는 당신의 파일이 실제로 소켓이 아닌 경우가 아니라면, 당신이 ‘실제’파일 (즉, 드라이브에서)에서 읽을 때 거의 항상 사용하기를 원합니다 .

FILE *사용 에서 파일 설명자를 가져올 수 있으며 다음을 사용하여 파일 설명자에서 fileno()버퍼링 된 FILE *파일을 열 수 있습니다.fdopen()


답변

파일 설명자는 POSIX open()호출 에서 얻은 정수일뿐입니다 . 표준 C fopen()를 사용하면 FILE구조체를 다시 얻을 수 있습니다. FILE구조체는 파일의 끝 등의 에러 표시, 스트림 위치와 같은 다른 것들 사이에이 파일 디스크립터를 포함

따라서를 사용 fopen()하면 open(). 일반적으로 fopen()더 이식성이 FILE높고 struct, ie fprintf()및 family 를 사용하는 다른 모든 표준 C 함수를 사용할 수 있기 때문에 사용해야합니다 .

둘 중 하나를 사용하면 성능 문제가 없습니다.


답변

파일 설명자 대 파일 포인터

파일 설명자 :

파일 설명자는 open()시스템 호출에서 반환 된 정수 값 입니다.

int fd = open (filePath, mode);

  1. 로우 / 커널 레벨 핸들러.
  2. UNIX 시스템 호출의 read () 및 write ()에 전달합니다.
  3. 버퍼링 및 이러한 기능은 포함되지 않습니다.
  4. 휴대 성이 떨어지고 효율성이 떨어집니다.

파일 포인터 :

파일 포인터는 파일 식별, 파일 설명자 래핑, 버퍼링 기능 및 I / O 작업에 필요한 기타 모든 기능에fopen() 사용 되는 라이브러리 함수에 의해 반환 된 C 구조에 대한 포인터입니다. 파일 포인터는 FILE 형식 이며 해당 정의는 “/usr/include/stdio.h” 에서 찾을 수 있습니다 . 이 정의는 컴파일러마다 다를 수 있습니다.

FILE *fp = fopen (filePath, mode);

// A FILE Structure returned by fopen 
    typedef struct
    {
        unsigned char   *_ptr;
        int     _cnt;
        unsigned char   *_base;
        unsigned char   *_bufendp;
        short   _flag;
        short   _file;
        int     __stdioid;
        char    *__newbase;
#ifdef _THREAD_SAFE
        void *_lock;
#else
        long    _unused[1];
#endif
#ifdef __64BIT__
        long    _unused1[4];
#endif /* __64BIT__ */
    } FILE;
  1. 높은 수준의 인터페이스입니다.
  2. fread () 및 fwrite () 함수에 전달됩니다.
  3. 버퍼링, 오류 표시 및 EOF 감지 등이 포함됩니다.
  4. 더 높은 이동성과 효율성을 제공합니다.

답변

유용 할 수있는 포인트를 추가하고 싶습니다.

FILE *

  1. 프로세스 간 통신 (IPC)에는 사용할 수 없습니다.
  2. 범용 버퍼링 된 I / O가 필요할 때 사용하십시오. (printf, frpintf, snprintf, scanf)
  3. 디버그 로그에 여러 번 사용합니다. 예,

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);

FILE DESCRIPTOR

  1. 일반적으로 IPC에 사용됩니다.

  2. * nix 시스템의 파일 (장치, 파일, 소켓 등)에 대한 저수준 제어를 제공하므로 FILE *.


답변

FILE * 텍스트 파일 및 사용자 입력 / 출력으로 작업 할 때 더 유용합니다. 왜냐하면 다음과 같은 API 함수를 사용할 수 있기 때문입니다. sprintf() , sscanf(), fgets(), feof()

파일 설명자 API는 저수준이므로 소켓, 파이프, 메모리 매핑 된 파일 (물론 일반 파일)과 함께 작업 할 수 있습니다.


답변

토론을 완료하기위한 메모 (관심있는 경우) ….

fopen안전하지 않을 수 있으며 fopen_s또는 open독점 비트 세트를 사용해야 합니다. C1X는 x모드 를 제공 하므로 모드를 사용할 수 fopen있습니다 "rx"."wx" 등,

당신이 사용하는 경우 open, 당신은 고려해 볼 수 있습니다 open(..., O_EXCL | O_RDONLY,... )또는open(..., O_CREAT | O_EXCL | O_WRONLY,... ) .

예를 들어 fopen () 및 파일 생성에 대해 가정하지 마십시오 .