본문 바로가기
PROGRAMMING/C

[POSTECH MOOC] 컴퓨터공학 입문Ⅱ - 3

by 안녕나는현서 2021. 4. 6.
728x90

본 내용은 POSTECH '청년 AI · Big Data 아카데미 온라인 기초과정'을 수강하며 정리한 내용입니다.

Ⅶ 파일 입출력

 

<파일 입출력과 함수>

 

- 성적처리 문제 해결 (problem solving)

- 파일(file)

  • 데이터의 모임으로서 보조기억장치에 저장된 것
  • 텍스트(text) 파일은 사람이 알아볼 수 있는 문자나 숫자 등으로 이루어진 파일 
  • 텍스트 파일 작성 : 메모장에서 확장자 txt로 저장 (input.txt)

- 텍스트 파일과 소스코드 파일

  • 텍스트 파일 작성 : 메모장에서 확장자 .txt로 저장

  • 소스코드 작성 : 확장자 .c로 저장

  • 소스코드에서 파일을 입력 받을 경우, 소스코드와 입력 파일을 같은 폴더에 넣고 저장

- 파일 입출력 처리 순서

  1. 파일 연결 (input.txt, output.txt)
    • 파일을 주소를 저장할 수 있는 파일 포인터 변수 선언
    • input.txt : 프로그램 실행 전에 작성
    • output.txt : 프로그램 실행 전에 만들지 않고 프로그램 실행 후에 자동 생성됨
    • FILE* inData, outData
  2. 파일 열기
    • fopen() 함수 사용
  3. 파일의 데이터 읽어오기
    • fscanf() 함수 사용
  4. 읽어온 데이터로 성적 처리
    • if, else 등의 명령어 사용
  5. 파일 닫기
    • fclose() 함수 사용

- 함수 호출 방법

  • 변수 유효 범위
    • 지역 변수 : 함수 안에서 만들어진 변수는 그 안에서만 유효함
    • 지역 변수의 값을 다른 함수에서 이용하기 위해서는 값에 의한 호출을 이용하여 변수값을 복사하여 전달하거나 주소에 의한 호출을 이용하여 주소값 전달하여 사용
    • 원본(main) 데이터의 수정 여부에 따라 함수 호출 방법 결정

- 구조도

<파일 입출력과 함수 예제 실습>

 

#include <stdio.h>

int main(void)
{
	/* 1. 변수 선언 */
	
	FILE* spStu;          /* 입력파일 주소 저장할 포인터변수 */
	FILE* spGrades;       /* 출력파일 주소 저장할 포인터변수 */
	
	int stuID, exam1, exam2, final;        /* 입력데이터 변수*/ 
	int avrg;
	char grade;
	
	printf("Begin student grading \n");
	
	/* 2. 파일 열기 */
	
	if(!(spStu = fopen("input.txt", "r")))              /* 읽기모드 열기 */
	{
		printf("Error opening student file \n");        /* 에러 처리 */ 
		return 100;                                     
        /* 100이라는 메세지를 보내며 프로그램 종료 */ 
	}
	if(!(spGrades = fopen("output.txt", "w")))          /* 쓰기모드 열기 */
	{
		printf("Error opening grades file \n");
		return 102;
	} 
		 
	/* 3. 반복하기 : 입력데이터가 여러 줄 -> 반복해서 입력, 계산, 출력 함수호출 */
	
	while (getStu(spStu, &stuID, &exam1, &exam2, &final)) /*데이터입력 함수호출*/ 
	{
		calcGrade(exam1, exam2, final, &avrg, &grade);  /*성적계산 함수호출*/ 
		writeStu(spGrades, stuID, avrg, grade);         /*성적출력 함수호출*/ 
	} 
	
	/* 4. 파일 닫기 */
	
	fclose(spStu);
	fclose(spGrades);
	
	printf("End student grading \n");
	
	return 0; 
}

int getStu(FILE* spStu, int* stuID, int* exam1, int* exam2, int* final)
{
	int ioResult;              /* 입력데이터 에러여부 확인용 변수 */ 
	ioResult = fscanf(spStu, "%d%d%d%d", stuID, exam1, exam2, final);
	/* fscanf 함수는 입력 받는 데이터의 개수(4)를 리턴함 */
	/* spStu : 파일포인터변수 */
	/* stuID ~ final : 포인터변수(주소)이므로 & 없음 */
	
	if (ioResult == EOF)      /* EOF(End of File) : 파일의 끝 확인 */
		return 0;
	else if (ioResult != 4)   /* 데이터가 4개가 아니면 에러처리 */
	{
		printf("Error reading data \n");
		return 0;              
        /* 파일 데이터가 끝났거나 개수가 다른 경우 0 리턴 */ 
	}
	else
	return 1;                  /* 정상 입력 시 1을 리턴*/ 
 } 
 
 void calcGrade(int exam1, int exam2, int final, int* avrg, char* grade)
 {
 	*avrg = (exam1 + exam2 + final) / 3;
 	
 	if (*avrg >=90 )
 		*grade = 'A';
 	else if (*avrg >= 80)
 		*grade = 'B';
 	else if (*avrg >= 70)
 		*grade = 'C';
 	else if (*avrg >= 60)
 		*grade = 'D';
 	else
 		*grade = 'F';	
} 

void writeStu(FILE* spGrades, int stuID, int avrg, char grade)
{
	fprintf(spGrades, "%04d %d %c \n", stuID, avrg, grade);
	/* output.txt 파일로 실행 결과 직접 출력, 모니터에는 나오지 않음 */
	/* %04d : 4개의 칸에 학번 출력 */ 
}

728x90

댓글