C에서 fscanf를 사용하여 한 줄씩 파일 읽기

Jinku Hu 2023년10월12일
  1. fscanf함수를 사용하여 C에서 한 줄씩 파일 읽기
  2. fscanf함수를 사용하여 C에서 단어 단위로 파일 읽기
C에서 fscanf를 사용하여 한 줄씩 파일 읽기

이 기사에서는 C에서fscanf를 사용하여 한 줄씩 파일을 읽는 방법에 대해 설명합니다.

fscanf함수를 사용하여 C에서 한 줄씩 파일 읽기

fscanf함수는 C 표준 라이브러리 형식 입력 유틸리티의 일부입니다. stdin에서 읽을scanf, 문자열에서 읽을sscanf,FILE포인터 스트림에서 읽을fscanf와 같은 다양한 입력 소스에 대해 여러 함수가 제공됩니다. 후자는 일반 파일을 한 줄씩 읽고 버퍼에 저장하는 데 사용할 수 있습니다.

fscanfprintf 지정자와 유사한 형식 지정 사양을 취하며 모두이 페이지에 자세히 나열되어 있습니다). 다음 예에서는 fopen함수 호출을 사용하여 샘플 입력 파일을 열고 읽기 스트림을 저장할 전체 파일 크기의 메모리를 할당합니다. "%[^\n] "줄 바꾸기 문자가 나타날 때까지 파일 스트림을 읽기 위해 형식 문자열이 지정됩니다. fscanf는 입력 끝에 도달하면 EOF를 반환합니다. 따라서 우리는while 루프를 사용하여 반복하고 각 줄을 하나씩 인쇄합니다.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  FILE *in_file = fopen(filename, "r");

  struct stat sb;
  stat(filename, &sb);

  char *file_contents = malloc(sb.st_size);

  while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

출력:

> Temporary string to be written to file

입력 파일 이름이 파일 시스템에 있으면 이전 코드가 성공적으로 실행될 가능성이 높지만 그럼에도 불구하고 여러 함수 호출이 실패하고 프로그램이 비정상적으로 종료 될 수 있습니다. 다음 예제 코드는 오류 검사 루틴이 구현 된 수정 된 버전입니다.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  FILE *in_file = fopen(filename, "r");
  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);

  while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

출력:

> Temporary string to be written to file

fscanf함수를 사용하여 C에서 단어 단위로 파일 읽기

fscanf기능을 활용하는 또 다른 유용한 경우는 파일을 탐색하고 공백으로 구분 된 모든 토큰을 구문 분석하는 것입니다. 이전 예제에서 변경해야 할 유일한 것은 형식 지정자에 대한"%[^\n ] "입니다. stat시스템 호출은 파일 크기를 검색하는 것이며 값은 버퍼를 할당하기 위해malloc인수로 전달하는 데 사용됩니다. 이 방법은 일부 시나리오에서는 낭비 일 수 있지만 가장 큰 단일 행 파일도 버퍼에 저장할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char *filename = "input.txt";

int main(int argc, char *argv[]) {
  FILE *in_file = fopen(filename, "r");
  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);

  while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
    printf("> %s\n", file_contents);
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

출력:

> 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