본문으로 바로가기

C언어 파일 입출력

category C언어 2019. 7. 9. 20:13
728x90

C언어를 사용하다 보면 데이터를 파일로 저장하거나, 파일 속에 있는 내용을 불러와 입력을 받거나, 저장한 내용을 수정해야 되는 경우가 생긴다. 그걸 위해서 C언어 stdio.h 헤더 파일에는 파일 입출력을 지원한다.

 

파일 입출력을 사용하기 위한 기본적인 함수의 형태는 

종류

설명

FILE *(파일 포인터)

처리할 파일을 가리킴

fopen(경로와파일명, 모드)

파일을 여는데 사용

fclose(파일 포인터)

파일을 닫음

fputc(출력할 문자, 파일포인터)

파일 포인터 위치에 문자 하나 출력

fputs(출력할 문자열, 파일포인터)

파일 포인터 위치에 문자열 출력

fprintf(파일 포인터,

문자열을 출력

fgetc(파일 포인터)

파일 포인터 위치에서 문자를 읽어옴

fgets(문자열, 파일포인터)

파일 포인터 위치에서 문자열을 읽어옴

fscanf(파일 포인터, 서식 문자열, 저장할 변수 주소)

파일 포인터 위치에서 입력값을 읽어옴

 위 종류를 이용해서 우리는 C언어로 파일을 관리하며, 읽고, 쓰고, 변경할 수 있다.

 

파일을 열 때 모드를 사용하는데 모드의 종류는

모드

기능

파일 없음

파일 있음

기존 파일 보호

r

읽기(입력)

에러

기존 파일 이용

에러

r+

읽기/쓰기(출력)

에러

기존파일 이용

겹쳐 써짐

w

쓰기

새로 생성

새로 생성

지워짐(새로 생성)

w+

쓰기/읽기

새로 생성

새로 생성

지워짐(새로 생성)

a

쓰기(덧붙이기)

새로 생성

기존 파일 이용

뒤쪽에 써짐

a+

쓰기, 읽기

새로 생성

기존 파일 이용

뒤쪽에 써짐

위와 같은 여러 가지의 모드가 존재한다.

 

그럼 이제 파일 입출력에 관한 간단한 예제를 보겠다.

 

아래는 간단하게 파일을 복사하는 방식의 코드이다.

#include <stdio.h>
#include <stdlib.h>

void main(int argc, char *argv[]){
	FILE *fp, *fp1;
	if(argc == 1){
		fprintf(stderr, "usage : %s Original-file to copy-file\n", *argv);
		exit(-1);
	}
	fp = fopen(*++argv, "r"); //읽기 
	fp1 = fopen(*++argv, "w"); //쓰기 
	
	if(fp == NULL){
		fprintf(stderr,"%s is not found\n", *--argv);
		exit(-1);
	}
	
	copyloop(fp, fp1);
	fclose(fp);
	fclose(fp1);
}

copyloop(FILE *fp, FILE *fp1){
	int i;
	while((i = getc(fp)) != EOF)
		fputc(i, fp1);
	printf("1 copy Success\n");
}

위 코드를 컴파일하여 실행파일을 만든 후에 명령 프롬프트로 접근한다.

 

현재 실행파일은 copy2.exe로 저장된 상태이다.

 

우리 코드에서는 단순히 읽기를 위한 모드'r'을 사용했기 때문에 a.txt 파일이 존재하지 않아 기본 베이스 파일이 없다는 에러 메시지를 출력하게 된다. 하지만 생성되는 b.txt는 모드'w'를 사용했기 때문에 a.txt 가 존재하든 존재하지 않든 비어있는 파일이 하나 생성된다.

 

그럼 다시 파일을 생성하고 진행을 해보겠다.

a.txt라는 파일을 생성한다.

 

생성 후 "hello"라는 글자를 삽입한 다음 저장하였다.

그리고 아까와 마찬가지로 복사를 진행한다.

 

아까와 같은 방식으로 실행시키고 이번에는 c.txt라는 파일에 복사를 진행해 보았다. 베이스 파일이 존재하기 때문에 정상적으로 복사가 되었다는 결과가 출력이 된다.

 

그리고 그림과 같이 정상적으로 내용물까지 복사가 되어있는 것을 알 수 있다.

파일 입출력은 모드가 다양하기 때문에 여러 방식으로 사용할 수 있다.

728x90

'C언어' 카테고리의 다른 글

C언어 동적 메모리 할당  (0) 2019.07.09