파일 설명자와 파일 포인터의 차이점은?
나는 파일 설명자와 파일 포인터의 차이점을 알고 싶다.
또한 어떤 시나리오에서 다른 시나리오 대신 하나를 사용하시겠습니까?
파일 설명자는 리눅스 및 기타 유닉스 유사 시스템에서 커널 수준에서 열린 파일(또는 소켓 등)을 식별하는 데 사용되는 낮은 수준의 정수 "핸들"이다.
다음과 같은 실제 Unix 호출에 "naked" 파일 설명자를 전달하는 경우read()
write()
등등.
A FILE
포인터(pointer)는 파일을 나타내는 데 사용되는 C 표준 라이브러리 수준 구성물이다.그FILE
파일 설명자를 랩으로 감싸고 버퍼링 및 기타 기능을 추가하여 I/O를 쉽게 한다.
너는 합격했다.FILE
다음과 같은 표준 C 함수에 대한 포인터fread()
그리고fwrite()
.
하나는 완충(buffered)이다.FILE *
와 다른 않다와 다른 하나는 그렇지 않다.실제로 사용하고자 하는 경우FILE *
당신이 드라이브에서, 당신이 무엇을 하고 있는지 알지 못하는 한, 또는 당신의 파일이 실제로 소켓이 아니면..
에서 파일 설명자를 가져올 수 있다.FILE *
사용.fileno()
그리고 당신은 버퍼링을 열 수 있다.FILE *
다음을 사용하여 파일 설명자로부터fdopen()
파일 설명자 대 파일 포인터
파일 설명자:
File Descriptor(파일 설명자)는 다음에 의해 반환되는 정수 값이다.open()
시스템 호출
int fd = open (filePath, mode);
- 로우/커널 레벨 핸들러.
- UNIX 시스템 호출의 읽기() 및 쓰기()를 위한 passe.
- 버퍼링 및 그러한 기능은 포함하지 않는다.
- 휴대성이 떨어지고 효율성이 떨어진다.
파일 포인터:
파일 포인터(File Pointer)는 다음에 의해 반환된 C 구조물에 대한 포인터임fopen()
파일 식별, 파일 설명자 포장, 버퍼링 기능 및 I/O 작업에 필요한 기타 모든 기능에 사용되는 라이브러리 기능.파일 포인터 유형은 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 탐지 등이 포함된다.
- 높은 휴대성과 효율성을 제공한다.
이다.open()
C 전화. 표준 C 사를 함.fopen()
당신은 A를 받는다.FILE
구조적으로 거슬러 올라가다그FILE
구조는 파일 끝 및 오류 표시기, 스트림 위치 등과 같은 다른 것들 중에서 이 파일 설명자를 포함한다.
그래서 사용fopen()
에 비해 어느 정도 추상적인 느낌을 준다.open()
일반적으로 당신은 다음을 사용해야 한다.fopen()
그것은 더 휴대성이 좋고 당신은 그것을 사용하는 다른 모든 표준 C 기능을 사용할 수 있다.FILE
구조, 즉,fprintf()
그리고 가족들.
둘 중 하나를 사용하는 성능 문제는 없다.
나는 여기서 좋은 자원을 발견했는데, 그 둘 사이의 차이점에 대한 높은 수준의 개요를 제공했다.
파일로 입력 또는 출력을 하려면 프로그램과 파일 사이의 연결을 나타내는 두 가지 기본 메커니즘, 즉 파일 설명자와 스트림을 선택하십시오.파일 설명자는 타입 int의 객체로, 스트림은 FILE * 객체로 표현된다.
파일 설명자는 입력 및 출력 작업에 원시적이고 낮은 수준의 인터페이스를 제공한다.파일 설명자와 스트림 모두 장치(단말기 등)에 대한 연결 또는 다른 프로세스와 통신하기 위한 파이프 또는 소켓과 일반 파일을 나타낼 수 있다.그러나 특정 종류의 장치에 특정한 제어 작업을 수행하려면 파일 설명자를 사용해야 한다. 이런 방식으로 스트림을 사용할 수 있는 기능이 없다.프로그램이 비차단(또는 폴링) 입력과 같은 특수 모드에서 입력 또는 출력을 수행해야 하는 경우에도 파일 설명자를 사용해야 한다(파일 상태 플래그 참조).
스트림은 원시 파일 설명자 시설 위에 레이어드된 더 높은 수준의 인터페이스를 제공한다.스트림 인터페이스는 모든 종류의 파일을 거의 비슷하게 처리한다. 유일한 예외는 선택할 수 있는 세 가지 유형의 버퍼링(Stream Buffering 참조)이다.
스트림 인터페이스를 사용하는 주된 이점은 스트림에서 실제 입력 및 출력 작업을 수행하기 위한 기능 세트가 파일 설명자를 위한 해당 설비보다 훨씬 풍부하고 강력하다는 것이다.파일 설명자 인터페이스는 문자 블록 전송을 위한 간단한 기능만 제공하지만 스트림 인터페이스는 문자 및 라인 지향 입출력 기능뿐만 아니라 강력한 포맷의 입력 출력 기능(프린트프 및 스캔프)도 제공한다.
스트림이 파일 설명자 단위로 구현되기 때문에 스트림에서 파일 설명자를 추출하고 파일 설명자에서 직접 낮은 수준의 작업을 수행할 수 있다.또한 처음에는 파일 설명자로 연결을 연 다음 해당 파일 설명자와 연결된 스트림을 만들 수 있다.
일반적으로 파일 설명자에서만 수행할 수 있는 특정 작업이 없으면 파일 설명자보다는 스트림을 사용하는 방법을 고수해야 한다.초보 프로그래머로서 어떤 기능을 사용해야 할지 잘 모를 경우, 포맷된 입력 기능(포맷된 입력 참조)과 포맷된 출력 기능(포맷된 출력 참조)에 집중하는 것이 좋다.
GNU 이외의 시스템에 프로그램을 이식할 수 있는 것이 염려되는 경우 파일 설명자는 스트림만큼 휴대할 수 없다는 것도 알아야 한다.ISO C를 실행하는 어떤 시스템이라도 스트림을 지원할 것으로 기대할 수 있지만, 비 GNU 시스템은 파일 설명자를 전혀 지원하지 않거나, 파일 설명자에서 작동하는 GNU 기능의 서브셋만 구현할 수도 있다.그러나 GNU C 라이브러리에 있는 파일 설명자 함수의 대부분은 POSIX.1 표준에 포함되어 있다.
유용할 수 있는 점을 추가하고 싶다.
정보FILE *
- 프로세스 간 통신(IPC)에 사용할 수 없음.
- genral purpose 완충 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 시스템(장치, 파일, 소켓 등)에 있는 파일에 대한 낮은 수준의 제어 권한을 제공하므로, *nix 시스템(장치, 파일, 소켓 등)보다 더 강력함
FILE *
.
토론을 마치기 위해 메모만 하면 된다(관심할 경우)
fopen
불안정한 상태일 수 있고, 당신은 아마도fopen_s
또는open
독점 비트를 설정하여C1X가 제공하는 제품x
모드, 즉fopen
격식을 차리고"rx"
,"wx"
등
사용한다면open
, 당신이 고려할 수 있다.open(..., O_EXCL | O_RDONLY,... )
또는open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
예를 들어, fopen() 및 파일 생성에 대해 가정하지 않음을 참조하십시오.
FILE *
텍스트 파일과 사용자 입출력 작업을 할 때 보다 유용하며, 이는 다음과 같은 API 기능을 사용할 수 있기 때문이다.sprintf()
,sscanf()
,fgets()
,feof()
등
파일 설명자 API는 수준이 낮기 때문에 소켓, 파이프, 메모리 맵 파일(물론 일반 파일도 포함)으로 작업할 수 있다.
예를 들어 시스템 호출은 대부분 파일 설명자를 사용한다.read
그리고write
. 라이브러리 함수는 파일 포인터를 사용한다.printf
scanf
그러나 라이브러리 기능은 내부 시스템 호출만 사용하고 있다.
'programing' 카테고리의 다른 글
VueJS - 감시자의 첫 번째 변경 사항 건너뛰기 (0) | 2022.05.16 |
---|---|
Vue에 페이지를 남겨두기 전에 저장되지 않은 변경 사항을 사용자에게 경고하는 방법 (0) | 2022.05.16 |
vuejs의 json 개체에서 중첩된 키를 찾는 방법 (0) | 2022.05.16 |
"|="는 무슨 뜻인가?(파이프 이퀄 오퍼레이터) (0) | 2022.05.16 |
스프링 부트 - 예외를 포함한 모든 요청 및 응답을 한 곳에 기록하는 방법 (0) | 2022.05.16 |