문제

파일 디스크립터와 파일 포인터의 차이점을 알고 싶습니다.

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

도움이 되었습니까?

해결책

파일 디스크립터는 Linux 및 기타 UNIX와 유사한 시스템에서 커널 레벨에서 열린 파일 (또는 소켓 또는 무엇이든)를 식별하는 데 사용되는 저수준 정수 "핸들"입니다.

"Naked"파일 설명자를 실제 UNIX 호출에 전달합니다. 읽다(), 쓰다() 등등.

FILE 포인터는 파일을 나타내는 데 사용되는 C 표준 라이브러리 수준 구성입니다. 그만큼 FILE 파일 디스크립터를 감싸고 버퍼링 및 기타 기능을 추가하여 I/O를 더 쉽게 만들 수 있습니다.

당신은 통과 FILE 표준 C 함수에 대한 포인터 프레드 () 그리고 fwrite ().

다른 팁

하나는 버퍼링됩니다 (FILE *) 그리고 다른 하나는 아닙니다. 실제로 사용하고 싶습니다 FILE * 거의 항상 '실제'파일 (예 : 드라이브에서)을 읽을 때, 당신이하고있는 일을 알지 못하거나 파일이 실제로 소켓이 아닌 한 ..

파일 디스크립터를 얻을 수 있습니다 FILE * 사용 fileno() 그리고 버퍼를 열 수 있습니다 FILE * 파일 디스크립터에서 사용합니다 fdopen()

파일 디스크립터는 POSIX에서 얻는 정수 일뿐입니다. ' open()전화. 표준 사용 c fopen() 당신은 얻는다 FILE 다시 구조. 그만큼 FILE Struct는이 파일 디스크립터가 포함되어 있습니다. 파일 끝 및 오류 표시기, 스트림 위치 등과 같은 것들과 같은 것들.

그래서 사용 fopen() 에 비해 일정량의 추상화를 제공합니다 open(). 일반적으로 사용해야합니다 fopen() 그것은 더 휴대 성이므로 FILE 구조, 즉 fprintf() 그리고 가족.

OR을 사용하여 성능 문제가 없습니다.

파일 디스크립터 대 파일 포인터

파일 설명 자 :

파일 디스크립터는 반환 된 정수 값입니다 open() 시스템 호출.

int fd = open (filePath, mode);

  1. 낮은/커널 레벨 핸들러.
  2. passe to read () 및 write ()의 unix 시스템 호출.
  3. 버퍼링 및 그러한 기능은 포함되지 않습니다.
  4. 휴대성이 떨어지고 효율성이 부족합니다.

파일 포인터 :

파일 포인터는 fopen() 익숙한 라이브러리 기능 파일 식별, 파일 디스크립터 포장, 버퍼링 기능 및 I/O 작동에 필요한 기타 모든 기능. 파일 포인터는 유형입니다 파일, 그의 정의를 찾을 수 있습니다 "/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 (Intervacess Communication)에는 사용할 수 없습니다.
  2. Genral 목적 버퍼링 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 * 텍스트 파일 및 사용자 입력/출력으로 작업 할 때 더 유용합니다. 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 () 및 파일 생성에 대한 가정을하지 마십시오..

예를 들어 시스템 호출은 대부분 파일 디스크립터를 사용하고 있습니다. read 그리고 write. 라이브러리 기능은 파일 포인터를 사용합니다 ( printf , scanf). 그러나 라이브러리 기능은 내부 시스템 호출 만 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top