문제

당신이 사용하고 싶은 이유가 있습니까 (구문을 제외하고)

FILE *fdopen(int fd, const char *mode);

또는

FILE *fopen(const char *path, const char *mode);

대신에

int open(const char *pathname, int flags, mode_t mode);

Linux 환경에서 C를 사용할 때?

도움이 되었습니까?

해결책

첫째, 사용해야할만한 이유는 없습니다. fdopen 만약에 fopen 옵션입니다 open 다른 가능한 선택입니다. 당신은 사용해서는 안됩니다 open 원한다면 파일을 처음으로 열려면 FILE *. 그래서 포함 fdopen 그 목록에서 다른 목록은 다른 것과 다르지 않기 때문에 잘못되고 혼란 스럽습니다. 여기서 중요한 차이점은 C 표준 사이에 있기 때문에 이제 무시할 것입니다. FILE * 및 OS 특이 적 파일 설명 자.

사용해야 할 네 가지 주요 이유가 있습니다 fopen 대신에 open.

  1. fopen 당신이하고있는 것보다 훨씬 빠른 것으로 판명 될 수있는 버퍼링 IO를 제공합니다. open.
  2. fopen 파일이 바이너리 모드로 열리지 않은 경우 라인 엔딩 번역을 수행하므로 프로그램이 비 유닉스 환경으로 포팅되면 매우 유용 할 수 있습니다.
  3. FILE * 사용할 수있는 능력을 제공합니다 fscanf 그리고 다른 stdio 기능.
  4. 코드는 언젠가 ANSI C 만 지원하고 지원하지 않는 다른 플랫폼으로 포팅해야 할 수도 있습니다. open 기능.

내 생각에, 라인 엔딩 번역은 당신을 돕는 것보다 더 자주 당신의 방식으로 당신과의 구문 분석 fscanf 너무 약해서 필연적으로 더 유용한 것을 선호하여 그것을 던지게됩니다.

그리고 C를 지원하는 대부분의 플랫폼에는 an이 있습니다 open 기능.

그것은 버퍼링 문제를 남깁니다. 주로 파일을 순차적으로 읽거나 쓰는 곳에서는 버퍼링 지원이 실제로 도움이되고 빠른 속도가 향상됩니다. 그러나 데이터가 파일에있을 것으로 예상 될 때 파일에 데이터가 끝나지 않는 흥미로운 문제로 이어질 수 있습니다. 당신은 기억해야합니다 fclose 또는 fflush 적절한 시간에.

당신이하고 있다면 (일명 fsetpos 또는 fseek 두 번째는 표준 준수 방식으로 사용하기가 약간 까다 롭습니다.) 버퍼링의 유용성은 빠르게 내려갑니다.

물론, 내 편견은 소켓을 많이 사용하는 경향이 있다는 것입니다. FILE * 버퍼링이 전혀없고 종종 복잡한 구문 분석 요구 사항이 실제로 내 인식을 색칠하는 경우가 많습니다.

다른 팁

open() 저수준 OS 호출입니다. fdopen() OS 레벨 파일 디스크립터를 C 언어의 상위 수준 파일 abstraction으로 변환합니다. fopen() 전화 open() 백그라운드에서 파일 포인터를 직접 제공합니다.

File-Objects 오히려 RAW 파일 설명자를 사용하는 데는 몇 가지 장점이 있으며 여기에는 사용의 용이성뿐만 아니라 내장 버퍼링과 같은 다른 기술적 장점도 포함됩니다. 특히 버퍼링은 일반적으로 상당한 성능 이점을 초래합니다.

fopen 대 c

1) fopen a 라이브러리 기능 동안 open a 시스템 호출.

2) fopen 제공 버퍼링 된 IO 더 빠릅니다 open 그게 완충되지 않은.

3) fopen ~이다 가지고 다닐 수 있는 동안 open ~ 아니다 가지고 다닐 수 있는 (개방은 환경에 따라 다릅니다).

4) fopen 포인터를 반환합니다 파일 구조 (파일 *); open 파일을 식별하는 정수를 반환합니다.

5) a FILE * 사용할 수있는 능력을 제공합니다 fscanf 그리고 다른 stdio 기능.

당신이있는 경우 FILE *, 당신은 같은 함수를 사용할 수 있습니다 fscanf, fprintf 그리고 fgets 등. 파일 디스크립터 만있는 경우 입력 및 출력 루틴이 제한되어 있습니다. read, write 등.

사용중인 응용 프로그램의 0.1%에 속하지 않는 한 open 실제 성능 이점은 실제로 사용하지 않을만한 충분한 이유가 없습니다. fopen. 한 fdopen 파일 설명자를 가지고 놀지 않는다면 해당 전화가 필요하지 않습니다.

고수 fopen 그리고 그 방법의 가족 (fwrite, fread, fprintf, et al) 그리고 당신은 매우 만족할 것입니다. 마찬가지로 다른 프로그래머는 코드에 만족할 것입니다.

열기, 읽기, 쓰기를 사용한다는 것은 신호 인터페이스에 대해 걱정해야한다는 것을 의미합니다.

신호 핸들러에 의해 호출이 중단되면 함수는 -1을 반환하고 Errno를 Eintr로 설정합니다.

그래서 파일을 닫는 올바른 방법은

while (retval = close(fd), retval == -1 && ernno == EINTR) ;

열려 있는() 각각의 끝에 호출됩니다. fopen () 가족 기능. 열려 있는() 시스템 호출입니다 fopen () 라이브러리에서 사용자가 쉽게 사용하기위한 래퍼 기능으로 제공됩니다.

open() 시스템 호출이며 UNIX 기반 시스템에 맞춰져 있으며 파일 디스크립터를 반환합니다. 사용하는 파일 디스크립터에 쓸 수 있습니다 write() 다른 시스템 호출입니다.
fopen() 파일 포인터를 반환하는 ANSI C 함수 호출이며 다른 OS에 휴대 할 수 있습니다. 우리는 파일 포인터를 사용하여 쓸 수 있습니다 fprintf.

유니스 :
다음을 사용하여 파일 디스크립터에서 파일 포인터를 얻을 수 있습니다.

fP = fdopen(fD, "a");

파일 포인터에서 파일 디스크립터를 가져올 수 있습니다.

fD = fileno (fP);

또한 열어야 할 깃발에 따라 다릅니다. 위에서 논증 된대로 작성 및 읽기 (및 이식성)를위한 사용과 관련하여 F*를 사용해야합니다.

그러나 기본적으로 기본적으로 표준 플래그 (RW 및 부록 플래그)를 지정하려면 플랫폼 특정 API (POSIX OPEN과 같은) 또는 이러한 세부 사항을 추상화하는 라이브러리를 사용해야합니다. C- 표준에는 그러한 깃발이 없습니다.

예를 들어 파일이 종료 된 경우에만 파일을 열 수 있습니다. 플래그 생성을 지정하지 않으면 파일이 존재해야합니다. 생성에만 독점을 추가하면 파일이 존재하지 않는 경우에만 생성됩니다. 더 많은 것이 있습니다.

예를 들어 Linux 시스템의 경우 SYSF를 통해 노출 된 LED 인터페이스가 있습니다. 파일을 통해 LED의 밝기를 노출시킵니다. 0-255 범위의 문자열로 숫자를 쓰거나 읽습니다. 물론 당신은 해당 파일을 만들고 싶지 않으며 그것이 존재하는 경우에만 쓰기를 원하지 않습니다. 멋진 것 : FDOPEN을 사용하여 표준 호출을 사용 하여이 파일을 읽고 쓰십시오.

fopen이 fopen fgetc를 실행할 때마다 Fopen이 이중 판독 값을 유발했기 때문에 내 응용 프로그램의 fopen ()에서 open ()로 변경되었습니다. 이중 독서는 내가 성취하려고했던 것을 방해했습니다. Open ()은 당신이 그것을 요구하는 일을하는 것 같습니다.

사용 파일 열기 포펜
디스크의 파일에서 정보를 읽거나 쓰기 전에 파일을 열어야합니다. 파일을 열려면 fopen을 호출했습니다.

1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.

이것은 행동의 방식입니다 포펜 기능
버퍼링 프로세스 중에 몇 가지 원인이 있으며 시간을 정할 수 있습니다. 비교하는 동안 포펜(높은 수준 I/O)까지 열려 있는 (낮은 레벨 I/O) 시스템 호출은보다 빠릅니다. 포펜.

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