C에서 fscanf를 사용하여 한 줄씩 파일 읽기
이 기사에서는 C에서fscanf
를 사용하여 한 줄씩 파일을 읽는 방법에 대해 설명합니다.
fscanf
함수를 사용하여 C에서 한 줄씩 파일 읽기
fscanf
함수는 C 표준 라이브러리 형식 입력 유틸리티의 일부입니다. stdin
에서 읽을scanf
, 문자열에서 읽을sscanf
,FILE
포인터 스트림에서 읽을fscanf
와 같은 다양한 입력 소스에 대해 여러 함수가 제공됩니다. 후자는 일반 파일을 한 줄씩 읽고 버퍼에 저장하는 데 사용할 수 있습니다.
fscanf
는printf
지정자와 유사한 형식 지정 사양을 취하며 모두이 페이지에 자세히 나열되어 있습니다). 다음 예에서는 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
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