파일 디스크립터와 파일 포인터의 차이점은 무엇입니까?
-
19-09-2019 - |
문제
파일 디스크립터와 파일 포인터의 차이점을 알고 싶습니다.
또한 다른 시나리오에서 다른 시나리오 대신 사용 하시겠습니까?
다른 팁
하나는 버퍼링됩니다 (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);
- 낮은/커널 레벨 핸들러.
- passe to read () 및 write ()의 unix 시스템 호출.
- 버퍼링 및 그러한 기능은 포함되지 않습니다.
- 휴대성이 떨어지고 효율성이 부족합니다.
파일 포인터 :
파일 포인터는 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;
- 높은 수준의 인터페이스입니다.
- Fread () 및 fwrite () 함수로 전달됩니다.
- 버퍼링, 오류 표시 및 EOF 감지 등이 포함됩니다.
- 더 높은 이식성과 효율성을 제공합니다.
유용한 점을 추가하고 싶습니다.
에 대한 FILE *
- IPC (Intervacess Communication)에는 사용할 수 없습니다.
- Genral 목적 버퍼링 I/O가 필요할 때 사용하십시오 (printf, frpintf, snprintf, scanf)
디버그 로그에 여러 번 사용합니다. 예시,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
에 대한 FILE DESCRIPTOR
일반적으로 IPC에 사용됩니다.
*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
). 그러나 라이브러리 기능은 내부 시스템 호출 만 사용합니다.