본문 바로가기
개념/혼자 공부하는 C언어

chapter 18) 다양한 자료형을 형식에 맞게 입출력

by kiseno 2024. 10. 9.
728x90
반응형
SMALL
#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
```

728x90
반응형
LIST