C에서 open 대 fopen

Jinku Hu 2023년10월12일
  1. fopen함수를 사용하여 C에서 파일 열기 또는 만들기
  2. open기능을 사용하여 C에서 파일을 열거 나 생성
  3. creat기능을 사용하여 파일 열기 및 만들기
C에서 open 대 fopen

이 기사는 C에서openfopen함수를 사용하는 여러 방법을 보여줍니다.

fopen함수를 사용하여 C에서 파일 열기 또는 만들기

fopen은 파일 열기를 스트림 객체로 처리하기위한 C 표준 라이브러리 함수입니다. 본질적으로 시스템 호출 인open 함수와 달리fopenFILE 포인터 객체를 주어진 파일에 연결합니다. 두 가지 인수가 필요합니다. 첫 번째는 열 파일의 경로 이름을 나타내고 두 번째 인수는 파일을 열 모드를 나타냅니다.

fopen에는 mode 매개 변수에 대해 미리 정의 된 여러 값이 있으며, 모두 기능 매뉴얼 페이지에 자세히 설명되어 있습니다. 다음 예제 코드에서w +모드를 지정합니다.이 모드는 내용을 자르고 스트림을 처음에 배치하는 것과 함께 읽고 쓰기 위해 파일을 엽니 다. 주어진 함수 경로가 존재하지 않는 경우 호출은 쓰기위한 새 파일을 생성합니다.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  FILE* output_file = fopen(filename, "w+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }
  fwrite(str, 1, strlen(str), output_file);
  printf("Done Writing!\n");

  fclose(output_file);

  exit(EXIT_SUCCESS);
}

출력:

Done Writing!

open기능을 사용하여 C에서 파일을 열거 나 생성

반대로,open기능은 본질적으로fopen이 사용되는 경우에도 호출되는 하위 레벨 시스템 서비스입니다. 시스템 호출은 일반적으로 C 라이브러리 래퍼 함수를 사용하여 최종 사용자에게 제공되지만 해당 특성 및 성능 사용 사례는 C stio라이브러리의 경우와 다릅니다. 예: open은 두 번째 인수를int유형으로 취하고 새 파일이 작성 될 때 파일 모드 비트를 지정하는 선택적 세 번째 인수를 사용합니다. 다음 예제에서는 이전 샘플 코드와 유사한 기능을 보여줍니다.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_RDWR | O_CREAT);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

open호출은 새 파일 설명자를 만들고 해당 값을 호출자에게 반환합니다. 그렇지 않으면 실패시-1이 반환되고 그에 따라errno가 설정됩니다. 다음 코드 예제는S_IRWXU를 지정하는 선택적 모드 인수가있는open호출을 보여줍니다. 이러한 기호는<fcntl.h>헤더에 정의 된 매크로이며 파일의 다른 권한 플래그를 나타냅니다. S_IRWXU는 파일 소유자가 새로 생성 된 파일에 대한 읽기/쓰기/실행 권한이 있음을 의미합니다.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, S_IRWXU);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

creat기능을 사용하여 파일 열기 및 만들기

open에 포함 된 또 다른 시스템 호출은creat함수로, 특히 새 파일을 생성하는 데 사용할 수 있습니다. 또는 파일이 이미있는 경우 길이를 0으로 자릅니다. 이 함수는 기본적으로 다음 인수가있는open호출과 같습니다-O_CREAT | O_WRONLY | O_TRUNC. 따라서open에 비해 두 개의 인수 만 사용하고 두 번째 플래그 인수를 생략합니다.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = creat(filename, S_IRWXG);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C File