파일 설명자와 파일 포인터의 차이점은 무엇입니까?
파일 설명자와 파일 포인터의 차이점을 알고 싶습니다.
또한 어떤 시나리오에서 다른 것 대신 하나를 사용 하시겠습니까?
파일 설명자는 Linux 및 기타 Unix 계열 시스템에서 커널 수준에서 열린 파일 (또는 소켓 등)을 식별하는 데 사용되는 저수준 정수 "핸들"입니다.
당신은 같은 실제 유닉스 호출에 "알몸"파일 설명을 통과 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
It's generally used for IPC.
Gives low-level control to files on *nix systems.(devices,files,sockets,etc), hence more powerfull than the
FILE *
.
FILE *
is more useful when you work with text files and user input/output, because it allows you to use API functions like sprintf()
, sscanf()
, fgets()
, feof()
etc.
File descriptor API is low-level, so it allows to work with sockets, pipes, memory-mapped files (and regular files, of course).
Just a note to finish out the discussion (if interested)....
fopen
can be insecure, and you should probably use fopen_s
or open
with exclusive bits set. C1X is offering x
modes, so you can fopen
with modes "rx"
, "wx"
, etc.
If you use open
, you might consider open(..., O_EXCL | O_RDONLY,... )
or open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
See, for example, Do not make assumptions about fopen() and file creation.
System calls are mostly using file descriptor, for example read
and write
. Library function will use the file pointers ( printf
, scanf
). But, library functions are using internally system calls only.
'Programing' 카테고리의 다른 글
조건부 바인딩 : 오류가 발생한 경우 – 조건부 바인딩의 이니셜 라이저에는 선택적 유형이 있어야합니다. (0) | 2020.08.13 |
---|---|
다른 값을 기준으로 한 벡터를 정렬하는 방법 (0) | 2020.08.13 |
React에서 로컬 이미지를 어떻게 참조합니까? (0) | 2020.08.13 |
함수가 정의 된 위치를 찾는 방법은 무엇입니까? (0) | 2020.08.13 |
JavaScript에서 Date 객체를 수신하기 위해 JSON을 구문 분석하는 방법은 무엇입니까? (0) | 2020.08.13 |