C로 파일 읽기
이 기사에서는 C로 텍스트 파일을 읽는 방법에 대한 여러 가지 방법을 소개합니다.
fopen
및 fread
함수를 사용하여 C에서 텍스트 파일 읽기
fopen
및fread
함수는 C 표준 라이브러리의 입력 / 출력 기능의 일부입니다.
fopen
은 주어진 파일을 스트림으로 열고 프로그램에 필요에 따라 조작 할 수있는 핸들을 제공하는 데 사용됩니다. 두 개의 매개 변수,const char *
문자열로 파일 이름과 사전 정의 된 값 (r
,w
,a
,r+
,w+
, a+
). 파일을 읽어야 할 때 두 번째 매개 변수로r
을 전달하여 파일을 읽기 전용 모드로 엽니 다.
반면에fread
함수는 이미 열려있는 파일 스트림에서 읽기 작업을 수행하는 주요 행위자입니다. 읽기 바이트가 첫 번째 인수로 저장되어야하는 버퍼에 대한 포인터를 사용합니다. 두 번째 및 세 번째 인수는 스트림에서 읽을 항목 수와 각 항목의 크기를 지정합니다. 마지막 인수는 열린 파일 스트림 자체에 대한FILE *
포인터입니다.
또한stat
함수를 사용하여 단일fread
호출로 파일 크기를 검색하고 전체 내용을 읽습니다. 파일 크기는 전체 파일 내용을 저장할 충분한 공간을 할당하기 위해 malloc
함수에도 전달됩니다. 하지만 동적 메모리 할당은free
함수로 해제하고fclose
로 닫힌 파일을 열어야합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main(void) {
const char* filename = "input.txt";
FILE* input_file = fopen(filename, "r");
if (!input_file) 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, input_file);
printf("%s\n", file_contents);
fclose(input_file);
free(file_contents);
exit(EXIT_SUCCESS);
}
fopen
및getline
함수를 사용하여 C에서 텍스트 파일 읽기
또는stat
함수로 파일 크기 검색을 건너 뛰고 대신getline
함수를 사용하여 끝에 도달 할 때까지 파일의 각 행을 반복 할 수 있습니다. getline
은 주어진 파일 스트림에서 문자열 입력을 읽습니다. 이름에서 알 수 있듯이 함수는 개행 문자를 찾을 때까지 모든 바이트를 검색합니다.
getline
은 세 개의 매개 변수를 취하며 첫 번째 매개 변수는 읽은 바이트를 저장합니다. char *
로 선언하고NULL
로 설정할 수 있습니다. 한편, 두 번째 인수가 정수 0
의 주소 인 경우 getline
은 버퍼에 대한 동적 메모리를 자동으로 할당합니다. 버퍼는 사용자가 해제해야하므로 프로그램 끝에서 free
함수를 호출합니다.
이러한 매개 변수는 필요한 경우 다른 값을 가질 수 있으며, 모두이 함수 설명서에 설명되어 있습니다. 세 번째 매개 변수는 열린 파일 스트림의FILE *
포인터입니다.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
int main(void) {
const char* filename = "input.txt";
FILE* input_file = fopen(filename, "r");
if (!input_file) exit(EXIT_FAILURE);
char* contents = NULL;
size_t len = 0;
while (getline(&contents, &len, input_file) != -1) {
printf("%s", contents);
}
fclose(input_file);
free(contents);
exit(EXIT_SUCCESS);
}
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