Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

파일 입출력 본문

프로그래밍 언어/C언어

파일 입출력

세레프 2023. 3. 29. 07:58

 파일이란 데이터를 담는 논리적인 단위로, 데이터값을 가지고 있는 내용부분과 그 파일을 구분할 수 있도록 이름을 붙히는 제목부분으로 나눠져 있다. 변수나 배열은 프로그램이 실행되는 동안만 데이터를 가지고 있어서 다루는 것이 힘들다. 그래서 이러한 파일을 IDE를 통해 파일로 저장, 호출이 가능한데, 이 기능을 가진 함수를 파일 입출력 함수라고 한다. 

 파일의 입출력은 다음과 같은 과정이 진행되어야 한다.

  1. 파일 구조체 포인터 변수 선언
  2. 파일 개방 및 모드 설정 후 포인터에 저장
  3. 파일 입출력
  4. 파일 폐쇄

 

파일 개방과 폐쇄

 먼저, 파일을 입출력하기 위해서는 파일을 용도에 따라 열어야 한다. 이것을 파일 개방이라고 하는데, 보조기억장치에 있는 파일을 찾아내는 것을 말한다.

fopen(컴퓨터 내의 파일 위치 , 개방 모드)

 위의 구조는 파일을 스트림 파일에 연결하는 함수로, 개방 모드에 따라 사용 용도가 달라진다.

개방모드 파일이 있을 경우 파일이 없을 경우
r 읽기 위해 개방 Null
w 내용 새로작성을 위해 개방 새로운 파일 개방
a 내용 추가를 위해 개방 새로운 파일 개방

 이때, fopen함수의 출력값은 스트림 파일의 메모리 주소이며, 파일 구조체 포인터 변수로 해당 주소를 저장해야 한다.

 

 스트림파일이란 프로그램과 입출력 장치를 이어주는 논리적인 파일로, 입력을 받은 내용을 프로그램에 입력시키고, 출력할 내용을 받아 출력장치에 출력하는 역할을 한다. 그리고 이러한 스트림파일의 정보는 파일 구조체로 묶어서 보관한다.  그래서 File 구조체를 통해 포인터 변수를 생성하고, 스트림파일의 주소를 저장하는 것이다.

 

 이렇게 파일 개방을 통해 만들어진 스트림 파일은 메모리를 사용한다. 그래서 입출력이 종료된 파일은 메모리를 회수하고 재활용하기 위해서 파일을 닫아야 한다. 이것을 파일 폐쇄라고 한다.

fclose(파일 구조체 포인터 변수)

 위의 구조는 파일을 폐쇄하는 함수로, 스트림 파일에 남아있는 데이터가 장치에 기록되기 전에 시스템 사고로 인해 삭제가 될 수 있으며, 사용하지 않는 변수가 메모리를 차지하기 때문에, 스트림 파일은 사용이 끝나면 항상 닫아야 한다.

#include<stdio.h>

int main() {
	char str[300];
	FILE* rfp; //파일 포인터 변수 선언
	
	rfp = fopen("D:\\Code C sample\\data1.txt","r"); 
	printf("스트림 파일 주소: %d\n", rfp);
	fclose(rfp);
    return 0;
}

 이때  "\"는 제어문자의 시작을 뜻하기에 파일의 경로를 입력할 때 "\\"를 사용해야 한다.

 

파일 입력함수

 파일 입력함수는 해당 파일에 입력되어 있는 내용을 문자열이나 변수, 배열에 저장하는 함수로, 개방모드 "r"을 사용한다.

  • fgets(배열의 이름,사용할 배열 길이,파일 포인터);

  내용을 1줄 씩 문자열의 형태로 배열에 저장하는 함수로, 만약 파일이 여러 줄로 구성이 되어 있을 경우, 무한 반복문과  feof함수를 통해 저장할 수 있으며, 이때 배열의 저장 방식은 2차원 배열 저장방식이다.

#include<stdio.h>

int main() {
	char str[300];
	FILE* rfp; //파일 포인터 변수 선언
	
	rfp = fopen("D://Code C sample//data1.txt","r"); 
	fgets(str, 300, rfp);
	printf("파일에서 읽어온 내용:");
	puts(str);
	fclose(rfp);
    return 0;
}
파일의 내용 출력 내용
#include<stdio.h>

int main() {
		char str1[250];
	FILE* rfp;
	rfp = fopen("D://Code C sample//언어 종류.txt","r");
	for (;;) {
		fgets(str1, 250, rfp);

		if (feof(rfp)) {//파일 내용의 끝
			break;
		}
		else {
			printf("%s", str1);
		}
	}
	fclose(rfp)
    return 0;
}
파일의 내용 출력 내용

 

  • fscanf(파일 포인터, "형식지정자", &변수);

 파일의 내용을 형식지정자에 맞춰서 변수에 저장하는 함수로, 해당 파일의 내용에는 형식지정자로 지정된 형식만 있어야 한다.

#include<stdio.h>

int main() {
	FILE* rfp;
	int in;//파일에서 읽어올 숫자의 변수

	rfp = fopen("D://Code C sample//data2.txt", "r");

			fscanf(rfp, "%d", &in);
			printf("%d\n", in);
		
	fclose(rfp);
    return 0;
}
파일의 내용 출력 내용

 

파일 출력 함수

파일 출력함수는 문자열이나 변수, 배열에 저장되어있는 데이터값을 파일을 생성해서 저장하는 함수로, 개방모드 "w", "a"을 사용한다.

  • fputs(배열의 이름,파일 포인터);

 문자열 배열의 내용을 파일로 만드는 함수로, 파일명은 파일 개방할 때 사용한 fopen함수의 파일위치에서 지정할 수 있다. 

#include<stdio.h>

int main() {
	char str[25];
	FILE* wfp;

	wfp = fopen("D://Code C sample//data3.txt", "w");

	printf("문자열 입력(최대 24자)\n");
	gets(str);
	fputs(str, wfp);
	fclose(wfp);
    return 0;
}
출력 내용 파일 내용

 

  • fprintf(파일 포인터,형식지정자,변수);

 형식지정자에 맞춰서 변수에 저장되어 있는 데이터값을 파일로 만드는 함수로, "printf"함수로 출력되는 출력 값을 파일로 만드는 것이다.

#include<stdio.h>

int main() {
	int in;
	FILE* wfp;

	wfp = fopen("D://Code C sample//data5.txt", "w");

	printf("숫자 입력\n");
	scanf("%d", &in);
	fprintf(wfp, "%d", in);
	fclose(wfp);
    return 0;
}
출력 내용 파일 내용

 

 

파일 복사

 파일 입력함수로 파일의 내용을 변수, 배열에 저장한 뒤 출력 함수를 사용해서 변수,배열의 내용을 파일로 만들면, 파일의 내용이 똑같은 새로운 파일을 만들 수 있다. 

#include<stdio.h>

int main() {
	char str[250];
	FILE* rfp;
	FILE* wfp;
	rfp = fopen("D://Code C sample//언어 종류.txt", "r");
	wfp = fopen("D://Code C sample//data4.txt", "w");
	for (;;) {
		fgets(str, 250, rfp);

		if (feof(rfp)) {//파일 내용의 끝
			break;
		}
		else {
			fputs(str, wfp);
		}
	}
	fclose(rfp);
	fclose(wfp);
	//처음 열었던 파일을 먼저 닫아야 한다.
    return 0;
}
복사 할 파일 복사 된 파일

'프로그래밍 언어 > C언어' 카테고리의 다른 글

열거형  (0) 2023.03.09
공용체  (0) 2023.03.08
구조체와 비트필드  (0) 2023.03.07
구조체 내 구조체  (1) 2023.03.04
구조체 포인터  (1) 2023.03.03
Comments