728x90
본 내용은 POSTECH '청년 AI · Big Data 아카데미 온라인 기초과정'을 수강하며 정리한 내용입니다.
Ⅶ 파일 입출력
<파일 입출력과 함수>
- 성적처리 문제 해결 (problem solving)
- 파일(file)
- 데이터의 모임으로서 보조기억장치에 저장된 것
- 텍스트(text) 파일은 사람이 알아볼 수 있는 문자나 숫자 등으로 이루어진 파일
- 텍스트 파일 작성 : 메모장에서 확장자 txt로 저장 (input.txt)
- 텍스트 파일과 소스코드 파일
- 텍스트 파일 작성 : 메모장에서 확장자 .txt로 저장
- 소스코드 작성 : 확장자 .c로 저장
- 소스코드에서 파일을 입력 받을 경우, 소스코드와 입력 파일을 같은 폴더에 넣고 저장
- 파일 입출력 처리 순서
- 파일 연결 (input.txt, output.txt)
- 파일을 주소를 저장할 수 있는 파일 포인터 변수 선언
- input.txt : 프로그램 실행 전에 작성
- output.txt : 프로그램 실행 전에 만들지 않고 프로그램 실행 후에 자동 생성됨
- FILE* inData, outData
- 파일 열기
- fopen() 함수 사용
- 파일의 데이터 읽어오기
- fscanf() 함수 사용
- 읽어온 데이터로 성적 처리
- if, else 등의 명령어 사용
- 파일 닫기
- 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
'PROGRAMMING > C' 카테고리의 다른 글
[POSTECH MOOC] 컴퓨터공학 입문Ⅱ - 4 (0) | 2021.04.07 |
---|---|
[POSTECH MOOC] 컴퓨터공학 입문Ⅱ - 2 (0) | 2021.04.06 |
[POSTECH MOOC] 컴퓨터공학 입문Ⅱ - 1 (0) | 2021.04.06 |
[POSTECH MOOC] 컴퓨터공학 입문Ⅰ - 4 (0) | 2021.04.05 |
[POSTECH MOOC] 컴퓨터공학 입문Ⅰ - 3 (0) | 2021.04.05 |
댓글