C study

C/C++) 파일 입출력 기초

mhe1239 2024. 12. 9. 14:29

C언어를 통해 파일을 열고 읽어오는 방법에 대해 알아보자.

기본적으로 순서는 파일 포인터 선언>fopen()함수로 파일 열기>여러 함수 처리>fcolse()함수로 파일 닫기이다.

파일을 저장하는 변수의 데이터 타입은 FILE으로 포인터로 저장한다. FILE*variable

일단 파일을 열기 위해서는 fopen함수를 사용해야한다.

FILE *fopen(const char *filename, const char *mode);

즉, variable=fopen("파일 경로", "읽기 모드")

기본적으로 파일 경로를 적을때에 C:/Users/Downloads/import.txt이런 형식이라면

C:\\Users\\Downloads\\import.txt이런식으로 폴더와 파일 경로는 '\'를 2개씩 써야한다.

(근데 \\ 대신 /써도 되긴한다.)

읽기 모드의 종류:

읽기 모드 설명
r 파일을 읽기 전용으로 열기
w 파일을 쓰기 전용으로 열기 (파일이 없으면 생성, 있으면 내용 삭제)
a 파일을  쓰기 전용으로 열기 (파일이 없으면 생성, 있으면 내용 추가)
r+ 파일을  읽기/쓰기 모드로 열기(파일이 존재해야함)
w+ 파일을  읽기/쓰기 모드로 열기 (파일이 없으면 생성, 있으면 내용 삭제)
a+ 파일을  읽기/쓰기 모드로 열기 (파일이 없으면 생성, 있으면 내용 추가)

이번 글에서는 기초이기에 r,w,a에 대해 다루겠다.

기본적으로 fopen을 통해 파일을 열었다면 fcolse를 통해 파일을 닫아줘야한다.

 

#include<stdio.h>//파일 가져오기 예시
int main() {
	FILE* rfp = fopen("C:\\Users\\Downloads\\import.txt", "r");//읽기 모드로 파일 열기
    	fclose(rfp);//연 파일 닫기
}

파일을 읽을/쓸 때에 문자 단위를 읽는다면 int fgetc(FILE *stream);를 사용하며,

문자열 단위를 읽는/쓴다면 char *fgets(char *str, int n, FILE *stream); / int fputs(const char *str, FILE *stream);

을 사용한다.

 

 

파일을 읽는 방법, r모드에 대해 먼저 알아보자.(r은 read의 줄임말)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char s[200];
int main() {
	FILE* rfp = fopen("C:/Users/name/Downloads/import pygame.txt", "r");//읽기 모드로 파일 열기
	fgets(s, 200, rfp);//s에 파일 내용 저장
	puts(s);//s 출력
	fgets(s, 200, rfp);//s에 파일 내용 저장
	puts(s);//s 출력
	fgets(s, 200, rfp);//s에 파일 내용 저장
	puts(s);//s 출력
	fgets(s, 200, rfp);//s에 파일 내용 저장
	puts(s);//s 출력
	fgets(s, 200, rfp);//s에 파일 내용 저장
	puts(s);//s 출력
	fclose(rfp);//연 파일 닫기

}

fget의 경우 읽을 파일(rfp)의 문자열(1줄 여기서는 크기를 200으로 잡음)을 s에 저장하는 코드이다.

그 후에 put 함수로 그 문자열을 cmd창에 출력한다.

이런식으로 파일을 읽어올 수 있다.

 

만약 파일 전체를 읽어오기 위해선 어떻게해야할까?

파일을 읽을 때에 끝인지를 판별할때에는 feof()함수를 사용하고, 파일 작업 중 에러가 발생했는지는 ferror()함수를 사용한다.

아래는 feof()함수로 끝을 판별하는 예이다.

#include<stdio.h>
char s[200];
int main() {
	FILE* rfp = fopen("C:\\Users\\name\\Downloads\\import pygame.txt", "r");//읽기 모드로 파일 열기
	while (1) {
		fgets(s, 200, rfp);//s에 파일 내용 저장
		if (feof(rfp)) {//파일 끝 감지
			break;
		}
		puts(s);
	}
	fclose(rfp);//연 파일 닫기
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char s[200];
int main() {
	FILE* rfp = fopen("C:\\Users\\name\\Downloads\\import pygame.txt", "r");//읽기 모드로 파일 열기
	for(; feof(rfp);) {
		fgets(s, 200, rfp);//s에 파일 내용 저장
		puts(s);
	}
	fclose(rfp);//연 파일 닫기
}

for문이나 while문을 통해 조건으로 끝을 감지하면 빠져나가는 코드이다.

 

이번에는 쓰기, w 모드에 대해 알아보자.(w는 write의 줄임말)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <conio.h>
char s[200],f[200];
int main() {
	FILE* wfp = fopen("C:\\Users\\name\\Downloads\\import pygame.txt", "w");
	gets(f);
	fputs(f,wfp);//파일에 쓴다
    	scanf("%s", f);
	fprintf(wfp,"%s\n",f);//파일에 쓴다.
	puts(f);//cmd창에 출력한다.
	fclose(wfp);
}

일단 쓸 문자열(f)을 cmd창에서 쓴 후에 fprintf나 fput로 쓸 파일(wfp)에 f를 쓰는 구조이다.

fprint의 경우 개행문자를 포함할지 등을 선택할 수 있다.

 fput는 더 간단하지만 fput의 경우 개행문자를 포함할지 선택이 불가하다는 단점이 있다.

 

이 읽기 모드와 쓰기 모드를 응용해서 파일을 읽어와서 다른 파일에 쓸 수 있다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char s[200];
int main() {
	FILE* rfp fopen("C:\\Users\\name\\Downloads\\import pygame.txt", "r");
	FILE* wfp = fopen("C:\\Users\\name\\Downloads\\copy.txt", "w");
	for (; feof(rfp);) {
		fgets(s, sizeof(s), rfp);
		fputs(s, wfp);
	}

	fclose(rfp);
	fclose(wfp);
}

이 코드는 import pygame이라는 파일 내용을 copy라는 파일에 쓰는 코드이다.

 

쓰기모드인 r모드로 특정 파일에 문자를 쓰면 생기는 문제가 있다

그 특정파일에 이미 내용이 있는 상태여도 그 내용을 모두 지우고 처음부터 내가 쓸 문자열로 덮어쓴다는 점이다.

a모드의 경우 append의 줄임말으로 그 특정 파일의 내용 밑에 내가 쓸 문자열을 쓰기 때문에 이 문제를 해결한 모드가 a 모드이다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char s[200], f[200]="Was the file content overwritten?";
int main() {
	FILE* wfp = fopen("C:\\Users\\name\\Downloads\\import pygame.txt", "w");
	gets(f);
	fputs(f, wfp);//파일에 쓴다
	scanf("%s", f);
	puts(f);//cmd창에 출력한다.
	fclose(wfp);
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
char s[200], f[200]="Was the file content overwritten?";
int main() {
	FILE* wfp = fopen("C:\\Users\\name\\Downloads\\import pygame.txt", "a");
	gets(f);
	fputs(f, wfp);//파일에 쓴다
	scanf("%s", f);
	puts(f);//cmd창에 출력한다.
	fclose(wfp);
}

파일 안에 내용이 있는 상태에서 이 두 코드를 실행시키면 w모드의 경우 원래의 내용이 사라지고 내가 cmd창에 입력한 문자가 새로 쓰여지고 a모드의 경우 cmd창에 입력한 문자가 원래 내용 밑에 추가되는 것을 확인할 수 있다.

'C study' 카테고리의 다른 글

C) scanf함수에 대해 자세히 파헤쳐 보자  (2) 2024.11.20
C/C++) Data Type 관련된 착각  (0) 2024.11.11