13장 스트림과 파일 입출력 라이브러리

JongseokLee·2021년 7월 31일
0

C 프로그래밍 기초

목록 보기
13/15
post-thumbnail

13장 스트림과 파일 입출력 라이브러리

1. 스트림과 파일 입출력 이해하기

1) 스트림(stream)

  • 입력 장치로부터 입력되는 데이터, 출력장치로 출력되는 데이터의 흐름
  • 프로그램과 입출력 장치들과의 논리적인 연결
  • 버퍼(buffer)를 이용하여 데이터를 입출력
    • 입출력 장치들의 처리시간에 따른 지연을 방지

2) 표준 입출력 스트림은 프로그램 실행 시 자동으로 생성 됨

종류장치사용함수
표준입력키보드scanf_s(), gets_s()
표준출력모니터printf(), puts()

3) 파일 입출력 스트림 사용을 하기 위한 순서

  • FILE 구조체 포인터 변수 선언 → fopen_s() 함수로 파일 입출력 스트림 생성 → 파일 입출력
  • 함수로 파일에 데이터 입출력 → fclose() 함수로 파일 입출력 스트림 종료

4) 파일 입출력 모드

기호설명파일이 존재하는 경우파일이 존재하지 않는 경우
r읽기스트림 생성파일 입출력 스트림 생성 못함
r+읽기+쓰기스트림 생성파일 입출력 스트림 생성 못함
w쓰기기존 내용을 덮어쓰기새로 생성
w+쓰기+읽기기존 내용을 덮어쓰기새로 생성
a추가스트림 생성새로 생성
a+추가+읽기스트림 생성새로 생성

2. 파일 입출력 라이브러리 활용하기

1) 텍스트 파일 입출력

  • 문자 입출력
    • 읽기 : int fgetc(FILE*fp)
    • 쓰기 : int fputc(int a, FILE*fp)
  • 문자열 입출력
    • 읽기 : char*fgets(char*buf, int sizeof(buf),FILE*fp)
    • 쓰기 : int fputs(char*buf, FILE*fp)
  • 형식지정 입출력
    • 읽기 : int fscanf_s(FILE*fp, "%s", input, sizeof(input))
    • 쓰기 : int fprintf(FILE*fp, "%d", input)

2) 바이너리 파일 입출력

  • 바이너리 데이터 입출력
    • 읽기 : int fread(&input, sizeof(int), 1, FILE*fp)
    • 쓰기 : int fwrite(&data, sizeof(int), 1, FILE*fp)
  • 임의 접근(Random Access)
    • 파일의 특정 위치에서 읽거나 쓸 수 있음
    • 바이트 단위로 위치를 지정
    • 위치이동 : int fseek(FILE*fp, 위치 이동값, 위치 기준값)
    • 위치반환 : int ftell(FILE*fp)

3. 단원 실습

1) 실행화면과 같이 data.txt 파일을 프로그램에서 만드시오.
2) data.txt 파일을 읽어서 out.txt를 작성하는 프로그램을 작성하시오.

	#include <stdio.h>
	#define MAX 3
	FILE* ip;   // 입력 파일 포인터
	FILE* op;  // 출력 파일 포인터
	struct MEMBER {
		char name[10];
		int age;
		double jumsu;
	} data[MAX];

	int main()
	{
		// data.txt 파일 생성
		printf("data.txt 파일을 생성합니다.\n");
		if (fopen_s(&op, "data.txt", "wt") == 0) {
			fprintf(op, "%5s %5d %5.1lf\n", "박장군", 45, 3.2);
			fprintf(op, "%5s %5d %5.1lf\n", "최왕자", 32, 4.1);
			fprintf(op, "%5s %5d %5.1lf\n", "김공주", 21, 3.5);
			fclose(op);
		}
		else {
			printf("data.txt 생성하지 못했습니다.\n");
		}

		// data.txt 파일 읽어서 구조체 배열에 저장
		printf("data.txt 파일을 구조체에 읽어옵니다.\n");
		if(	fopen_s(&ip, "data.txt", "rt") == 0 ) {
			for (int i = 0; i < MAX; i++) {
				if (fscanf_s(ip, "%s %d %lf", data[i].name, sizeof(data[i].name), &data[i].age, &data[i].jumsu) != 0) {
					printf("%5s %5d %5.1lf\n", data[i].name, data[i].age, data[i].jumsu);
				}
			}
			fclose(ip);
		}
		else {
			printf("data.txt 파일을 열지 못했습니다.\n");
		}

		// out.txt 파일을 생성합니다.
		printf("out.txt 파일을 생성합니다.\n");
		if (fopen_s(&op, "out.txt", "wt") == 0) {
			fprintf(op, "============================\n");
			fprintf(op, "성명\t나이\t학점\t환산(100점)\n");
			fprintf(op, "============================\n");
			for (int i = 0; i < MAX; i++) {
				int val = data[i].jumsu * 20;
				fprintf(op, "%-7s\t%-7d\t%-7.1lf\t%-7d\n", data[i].name, data[i].age, data[i].jumsu, val);
			}
			fprintf(op, "============================\n");
			fclose(op);
		}
		else {
			printf("out.txt 생성하지 못했습니다.\n");
		}
	}
    
 <Result>

profile
DataEngineer Lee.

0개의 댓글