1-7 파일 입출력
① 파일 입출력과 함수
• 성적처리 문제 해결하기
• 파일 입출력 처리 순서
1) 파일연결(input.txt, output.txt)
- 파일의 주소를 저장할 수 있는 파일 포인터 변수 선언
- FILE* inData, outData
2) 파일 열기
- fopen() 함수 사용
3) 파일의 데이터 읽어오기
- fscanf() 함수 사용
4) 읽어온 데이터로 성적처리
- if,else등의 명령어 사용
5) 파일 닫기
- fclose() 함수 사용
② 파일 입출력과 함수 예제 실습
#include<stdio.h>
int getStu (FILE* spStu, int* stuID, int* exam1, int* exam2, int*final);
void calGrade(int exam1, int exam2, int final, int*avrg, char*grade);
void writeStu(FILE* spgrades, int stuID, int avrg, char grade);
int main (void)
{ /*1.변수선언*/
FILE* spStu; //input.txt 입력파일의 주소를 저장할 포인터변수
FILE* spGrades; ////output.txt 입력파일의 주소를 저장할 포인터변수
int stuID,exam1,exam2,final;
int avrg;
char grade;
printf("Begin student grading");
/*2.파일열기*/
if(!(spStu = fopen("input.txt","r")))
//읽기모드 열기(파일오픈과 동시에 연결하는 소스코드-spStu는 파일의 주소를 저장함)
{ printf("Error opening student file\n");
return 100;
}
if(!(spGrades = fopen("output.txt","w"))) //쓰기모드 열기
{ printf("Error opening grades file\n");
return 102;
}
/*3.반복하기*/
while (getStu(spStu,&stuID, &exam1,&exam2,&final))
//반복문 통해서 여러 줄을 읽음
// 파일을 입력받아서 메인 함수 변수에까지 다시 넣어줘 (파일 읽기 전에는 메인함수 변수 비어 있으니까)
{
calGrade(exam1,exam2,final, &avrg, &grade);
//점수는 call by value로 활용하도록 보내고
// avrg와 grade는 call by address로 주소로 보내서 계산해서 다시 내 주소에 채워놔라~
writeStu(spGrades, stuID, avrg, grade);
//spGrades 주소에 위의 값 입력
}
/*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);
//포인터 변수이기에 바로 메인함수로 가서 채워 넣음, 이미 포인터 변수이기에 (&)안써줘도 됨
if (ioResult ==EOF) //end of file
return 0;
else if (ioResult !=4)
{ printf("Error reading data\n");
return 0; }
else
return 1;
}
/*성적계산*/
void calGrade(int exam1, int exam2, int final, int*avrg, char*grade)
//메인함수에 입력된 exam1, exam2, final값 call by value로 가져와서 계산한 후에 call by address로 받은 avrg, grade에 계산값 채움.
//역참조로 값이 메인으로 바로 넘어가기에 반환값 없음> void
{
*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)에 다음 값 넣어서 파일로 출력
}
'Language > C' 카테고리의 다른 글
[포스코 AI·Big Data 아카데미 사전학습] 컴퓨터 공학 입문 1-8_②배열과 구조체 (0) | 2023.06.10 |
---|---|
[포스코 AI·Big Data 아카데미 사전학습] 컴퓨터 공학 입문 1-8_① 배열과 구조 (0) | 2023.06.08 |
[포스코 AI·Big Data 아카데미 사전학습] 컴퓨터 공학 입문 1-6 반복문 (0) | 2023.06.05 |
[포스코 AI·Big Data 아카데미 사전학습] 컴퓨터 공학 입문 1-5 조건문 (0) | 2023.06.05 |
[포스코 AI·Big Data 아카데미 사전학습] 컴퓨터 공학 입문 1-4 연산자 (0) | 2023.06.05 |