Language/C

[포스코 AI·Big Data 아카데미 사전학습] 컴퓨터 공학 입문 1-7 파일 입출력

inji_ 2023. 6. 7. 12:15

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)에 다음 값 넣어서 파일로 출력 
 }