C에서 바이너리 파일 읽기

Jinku Hu 2023년10월12일
  1. fread함수를 사용하여 C에서 이진 파일 읽기
  2. read기능을 사용하여 C에서 이진 파일 읽기
C에서 바이너리 파일 읽기

이 기사에서는 C로 바이너리 파일을 읽는 방법에 대한 여러 가지 방법을 보여줍니다.

fread함수를 사용하여 C에서 이진 파일 읽기

fread는 C 표준 라이브러리 입출력 기능의 일부이며 일반 파일에서 바이너리 데이터를 읽는 데 사용할 수 있습니다. C 표준 라이브러리는 이진 파일 데이터 읽기/쓰기를 처리하기 위해 플랫폼 독립적 인 솔루션과 함께 사용자 버퍼 I/O를 구현합니다. 표준 I/O 함수는 파일 설명자 대신 파일 포인터에서 작동합니다. FILE *스트림은fopen 함수에 의해 검색됩니다.이 함수는 파일 경로를 문자열 상수로 사용하고이를 여는 모드를 사용합니다. 파일 모드는 읽기, 쓰기 또는 추가를 위해 파일을 열지 여부를 지정합니다. 하지만 각 모드 문자열에는 2 진 파일 모드를 명시 적으로 지정하기 위해 문자 b가 포함될 수 있습니다. 이는 텍스트와 바이너리 파일을 다르게 처리하는 일부 비 UNIX 시스템에서 해석 할 수 있습니다.

fopen이 파일 포인터를 반환 한 후fread함수를 호출하여 바이너리 스트림을 읽을 수 있습니다. fread는 4 개의 인수를 취하며, 그 중 첫 번째는 읽기 바이트가 저장되어야하는 위치에 대한void포인터입니다. 다음 두 인수는 주어진 파일에서 읽어야하는 데이터 항목의 크기와 수를 지정합니다. 마지막으로 함수의 네 번째 인수는 데이터를 읽어야하는FILE포인터입니다. 다음 예에서는input.txt라는 파일을 열고 임의의 바이트를 씁니다. 그런 다음 파일을 닫고 읽기 위해 다시 엽니 다.

#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

const uint8_t data[] = {0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
                        0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
                        0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x77,
                        0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74,
                        0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65};

const char* filename = "input.txt";

int main(void) {
  FILE* output_file = fopen(filename, "wb+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  fwrite(data, 1, sizeof data, output_file);
  printf("Done Writing!\n");
  fclose(output_file);

  FILE* in_file = fopen(filename, "rb");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  fread(file_contents, sb.st_size, 1, in_file);

  printf("read data: %s\n", file_contents);
  fclose(in_file);

  free(file_contents);
  exit(EXIT_SUCCESS);
}

출력:

Done Writing!
read data: Temporary string to be written to file

read기능을 사용하여 C에서 이진 파일 읽기

또는 본질적으로 후드 아래의 시스템 호출 인read함수를 사용할 수 있습니다. read는 파일 설명자에서 작동합니다. 따라서 파일은open시스템 호출로 열어야합니다. 읽은 데이터가 저장 될void포인터와 파일에서 읽을 바이트 수를 나타내는 추가 두 개의 인수가 필요합니다. 파일의 전체 내용을 읽고malloc함수를 사용하여 동적으로 메모리를 할당합니다. stat시스템 호출을 사용하여 파일 크기를 찾습니다.

#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

const uint8_t data[] = {0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
                        0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
                        0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x77,
                        0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74,
                        0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65};

const char* filename = "input.txt";

int main(void) {
  FILE* output_file = fopen(filename, "wb+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  fwrite(data, 1, sizeof data, output_file);
  printf("Done Writing!\n");
  fclose(output_file);

  int fd = open(filename, O_RDONLY);
  if (fd == -1) {
    perror("open\n");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  read(fd, file_contents, sb.st_size);

  printf("read data: %s\n", file_contents);
  close(fd);

  free(file_contents);

  exit(EXIT_SUCCESS);
}

출력:

Done Writing!
read data: Temporary string to be written to file
작가: 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