#include <stdio.h>
int main(void){
FILE *ifp, *ofp;
char name[20];
int kor, eng, math;
int total;
double avg;
int res;
ifp = fopen("a.txt", "r");
if (ifp == NULL){
printf("do not make the file.\n");
return 1;
}
ofp = fopen("b.txt", "w");
if (ofp == NULL){
printf("do not openn the file.\n");
return 1;
}
while(1){
res = fscanf(ifp, "%s%d%d%d", name, &kor, &eng, &math);
if (res == EOF) break;
total = kor + eng + math;
avg = total / 3.0;
fprintf(ofp, "%s%5d%7.1lf\n", name, total, avg);
}
fclose(ifp);
fclose(ofp);
return 0;
}
### 파일 처리
- `ifp`는 입력 파일 포인터로, "a.txt"를 읽기 모드로 엽니다. 파일 열기에 실패하면 에러 메시지를 출력하고 프로그램을 종료합니다.
- `ofp`는 출력 파일 포인터로, "b.txt"를 쓰기 모드로 엽니다. 파일 열기에 실패하면 에러 메시지를 출력하고 프로그램을 종료합니다.
### 데이터 처리
- `fscanf` 함수를 사용하여 "a.txt"에서 학생의 이름과 국어, 영어, 수학 점수를 읽어들입니다. `fscanf`는 성공적으로 읽은 항목의 수를 반환하며, 파일의 끝에 도달하면 `EOF`를 반환합니다.
- 읽어들인 점수들로부터 각 학생의 총점과 평균을 계산합니다. 평균은 실수로 계산하기 위해 `3.0`으로 나눕니다.
- `fprintf` 함수를 사용하여 학생의 이름, 총점, 평균을 "b.txt"에 기록합니다. 이름은 그대로, 총점은 5자리 오른쪽 정렬, 평균은 소수점 아래 한 자리까지 표시하여 출력합니다.
### 에러 메시지
- "do not make the file.\n"와 "do not open the file.\n" 메시지는 약간 혼동을 줄 수 있습니다. "do not make the file.\n"는 "Cannot open the file for reading.\n"으로, "do not open the file.\n"는 "Cannot open the file for writing.\n"으로 바꾸는 것이 더 명확할 수 있습니다.
### 프로그램 종료 시의 파일 처리
- 모든 작업이 완료된 후 `fclose` 함수를 사용하여 열린 파일들을 닫습니다. 이는 열린 파일에 대한 모든 버퍼를 비우고 시스템 자원을 해제하는 중요한 단계입니다.
### 예제 입력 및 출력
예를 들어, "a.txt"에 다음과 같은 내용이 있다고 가정해 봅시다:
```
James 90 80 70
Maria 95 85 75
```
그러면 "b.txt"에는 다음과 같은 내용이 기록될 것입니다:
```
James 240 80.0
Maria 255 85.0
```
'개념 > 혼자 공부하는 C언어' 카테고리의 다른 글
chapter 18) 버퍼를 공유함으로 인해 발생하는 문제 (1) | 2024.10.11 |
---|---|
chapter 18) 문자열을 한 문자씩 파일로 출력하기 (6) | 2024.10.10 |
chapter 18) stdin과 stdout을 사용한 문자 입출력 (7) | 2024.10.08 |
chapter 18) fread와 fwrite 함수의 차이 (0) | 2024.10.07 |
chapter 18) a+ 모드로 파일의 내용을 확인하며 출력 (0) | 2024.10.06 |