파일 설명자와 파일 포인터의 차이점을 알고 싶습니다.
또한 어떤 시나리오에서 다른 것 대신 하나를 사용 하시겠습니까?
답변
파일 디스크립터는 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);
- 로우 / 커널 레벨 핸들러.
- UNIX 시스템 호출의 read () 및 write ()에 전달합니다.
- 버퍼링 및 이러한 기능은 포함되지 않습니다.
- 휴대 성이 떨어지고 효율성이 떨어집니다.
파일 포인터 :
파일 포인터는 파일 식별, 파일 설명자 래핑, 버퍼링 기능 및 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;
- 높은 수준의 인터페이스입니다.
- fread () 및 fwrite () 함수에 전달됩니다.
- 버퍼링, 오류 표시 및 EOF 감지 등이 포함됩니다.
- 더 높은 이동성과 효율성을 제공합니다.
답변
유용 할 수있는 포인트를 추가하고 싶습니다.
약 FILE *
- 프로세스 간 통신 (IPC)에는 사용할 수 없습니다.
- 범용 버퍼링 된 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 *
텍스트 파일 및 사용자 입력 / 출력으로 작업 할 때 더 유용합니다. 왜냐하면 다음과 같은 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 () 및 파일 생성에 대해 가정하지 마십시오 .
