언어/C

[코딩자율학습] 18일차 파일입출력

홍시_코딩기록 2024. 3. 27. 11:10

 

fputs() 함수로 파일 쓰기

FILE * 포인터명 = fopen(파일명, 파일모드);
  • 파일에서 데이터를 읽고 쓸 때는 먼저 fopen()함수로 파일을 열어서 파일 포인터를 얻어야함.
  • 파일포인터는 fopen()함수를 통해 무슨 파일을 열었는지, 어디까지 읽었는지 등의 정보를 담음.

 

** 텍스트는 사람이 읽을 수 있는 문자열

바이너리 데이터는 컴퓨터가 읽을 수 있는 0과 1로 된 데이터

 

 

//형식
fputs(문자열, 파일포인터)

 

 

(파일 생성)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	FILE* file = fopen("C:\\\\Users\\\\홍시\\\\Desktop\\\\test1.txt", "wb");
	if (file == NULL) {
		printf("파일 열기 실패\\n");
		return 1;
	}
	fputs("fputs() 함수로 글을 써볼게요.\\n", file);
	fputs("잘 써지는지 확인해 주세요.\\n", file);
	fclose(file);
	return 0;
}
  • _CRT_SECURE_NO_WARNINGS fopen() 함수가 안전하지 않음. fopen_s()를 쓰면 되지만 다른 환경에서 호환되지 않아서 _CRT_SECURE_NO_WARNINGS 정의해야함.
  • fclose(): fclose()함수를 호출할 때 전달값으로 파일 포인터를 넣으면 파일 포인터가 가리키는 파일을 저장하고 닫음. fopen()으로 파일을 열었다면 반드시 fclose()로 닫을 것.

 

💡 #define

#define은 매크로를 정의하는 전처리기 지시문 define을 이용하면 전체 소스 코드 내 매크로를 일괄적으로 대체상수로 치환하게 되므로 필요시 대체상수의 값을 한번만 변경하면 모든 곳에 손쉽게 변경사항 적용.

 

 

fgets()함수로 파일 읽기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX 10000

int main(void) {
	char line[MAX];
	FILE* file = fopen("C:\\\\Users\\\\홍여정\\\\Desktop\\\\test1.txt", "rb");
	if (file == NULL) {
		printf("파일 열기 실패\\n");
		return 1;
	}
	while (fgets(line, MAX, file) != NULL) {
		printf("%s", line);
	}
	fclose(file);
	return 0;
}
  • MAX 10000 : 코드 내에서 MAX라는 값이 사용되면 숫자 10000으로 치환하겠다는 뜻
  • char line[MAX] : fgets()함수로 파일에서 값을 읽어와 값을 보관해둘 곳
  • while : fgets()함수로 읽어 온 값을 NULL과 비교해서 NULL이 아니면 while 문 안 문장을 실행함.
💡 fgets()함수의 작동 방식

파일에 저장된 내용을 문자열 단위로 읽음. 한번에 읽을 수 있는 문자열의 길이만큼 읽음. 여기서는 MAX로 설정했으므로 MAX 크기만큼 읽어옴.

 

 

형식을 지정해 파일 입출력하기

 

//형식
fprintf(파일포인터, "서식지정자",값);
fscanf(파일포인터, "서식지정자", &변수명);

 

fprintf()함수로 파일 쓰기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	FILE* file = fopen("C:\\\\Users\\\\홍시\\\\Desktop\\\\test2.txt", "wb");
	if (file == NULL) {
		printf("파일 열기 실패\\n");
		return 1;
	}
	fprintf(file, "%s %d %d %d %d %d %d \\n", "추첨번호", 1, 2, 3, 4, 5, 6);
	fprintf(file, "%s %d\\n", "보너스 번호", 7);
	fclose(file);
	return 0;
}
  • 파일 모드는 바이너리 데이터를 쓰는 목적(wb)으로 생성
  • fprintf() 함수로 로또 추첨번호를 파일에 저장함.

 

fscanf() 함수로 파일 읽기

  • 앞에서 입력한 로또 번호 받아오기
  • fscanf() test2.txt 파일의 내용을 읽어옴. 주소를 넣어야 하므로 &num[0] ~ &num[5]로 적음
  • printf()함수로 str1배열과 num[0]~num[5]에 저장된 값을 출력