파일 입출력 함수의 출력에 관한 질문입니다

조회수 666회

파일 입출력 함수 질문

안녕하세요 다른 분들에게 먼저 실례를 무릅쓰고 질문드립니다 프로그램은 파일 입출력 함수를 통하여 학생들의 정보를 입력하고 총점과 평균을 구하는 것입니다 프로그램 출력은 잘 되지만 출력 값이 이상하게 나오는 것에 대하여 질문 드립니다. 파일을 새로 만들고 내용을 저장하고 불러오는 것까지는 이상이 없습니다 그런데 평균 부분의 출력이 종료 되어야 할 "-1" 부분까지 합쳐서 나오는 것 같습니다. 메모장에서 -1 부분은 없습니다만 소스 코드 실행 시에는 마지막 77 의점수까지 합해 나옵니다 입력시 버퍼의 내용이 계속 남아 있어서 그런 것 같아 버퍼를 초기화 했는데도 결과가 같습니다. 제가 어느 부분에서 실수 하였는지를 알고 싶습니다. 알려주시면 감사 드리겠습니다

결과 화면

![이미지][1]

![이미지][2]

소스 코드

///* 실습) 성적 프로그램 작성하기  */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>  
#include <stdlib.h>

void main() {
    // 파일 = 변수
    FILE* fp = NULL;
    int number, count = 0;
    char name[20], fname[30];
    float score, total = 0.0 ;


    // 성적 파일명 입력 받기
    printf("성적 파일명을 입력 >> ");
    scanf("%s", fname);
    fflush(stdin);      // 버퍼 초기화

    // 성적 파일 생성
    if ((fp = fopen(fname, "w")) == NULL) {
        fprintf(stderr, "파일 %s 를 열 수 없습니다", fname);
        exit(1);
    }

    // 성적 관련 내용 출력
    while (1) {
        printf("학번 이름 성적 입력 (음수 입력시 종료됨) >> ");
        scanf("%d", &number);
        if (number < 0) 
            break;
        scanf("%s %f", name, &score);
        fflush(stdin);

        // 형식에 맞춘 출력
        fprintf(fp, "%d %s %f\n", number, name, score);
    }
    fclose(fp); // 여기서 종료 함수를 넣지 않으면 평균을 구할 수 없음

    // 파일 열기 실패
    if ((fp = fopen(fname, "r")) == NULL) {
        fprintf(stderr, "%s 파일을 열수 없음", fname);
        exit(1);
    }

    // 성적 합계, 평균
    while (!feof(fp)) {
        fscanf(fp, "%d %s %f", &number, name, &score);
        total += score;
            count++;
    }
    printf("%d 명 학생의 총합 점수 = %f\n", count, total);
    printf("%d 명 학생의 평균 점수 = %f\n", count, total / count);

    // 파일 종료
    fclose(fp);

}

[1]: https://res.cloudinary.com/eightcruz/image/upload/v1606902192/hl12gbtiubxmxnzz4vm4.png [2]: https://res.cloudinary.com/eightcruz/image/upload/v1606902206/qvza79o8huyi1by8iwzm.png

2 답변

  • 아래 코드 참고하세요.

    • 코드
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>  
    #include <stdlib.h>
    void main() {
        // 파일 = 변수
        FILE* fp = NULL;
    
        int number = 0, count = 0;
        char name[80] = { 0, }, fname[80] = { 0, };
        float score = 0.0, total = 0.0;
    
        // 성적 파일명 입력 받기
        printf("성적 파일명을 입력 >> ");
        scanf("%s", fname);
    
        // 성적 파일 생성
        if ((fp = fopen(fname, "w")) == NULL) {
            fprintf(stderr, "파일 %s 를 열 수 없습니다", fname);
            exit(1);
        }
    
        // 성적 관련 내용 출력
        while (1) {
            printf("학번 이름 성적 입력 (음수 입력시 종료됨) >> ");
            scanf("%d", &number);
            if (number < 0)
                break;
            scanf("%s %f", name, &score);
            fflush(stdin);
    
            // 형식에 맞춘 출력
            fprintf(fp, "%d %s %f\n", number, name, score);
        }
        fclose(fp); // 여기서 종료 함수를 넣지 않으면 평균을 구할 수 없음
    
        // 파일 열기 실패
        if ((fp = fopen(fname, "r")) == NULL) {
            fprintf(stderr, "%s 파일을 열수 없음", fname);
            exit(1);
        }
    
        // 성적 합계, 평균
        while (fscanf(fp, "%d %s %f", &number, name, &score) == 3)
        {
            total += score;
            count++;
        }
        printf("%d 명 학생의 총합 점수 = %f\n", count, total);
        printf("%d 명 학생의 평균 점수 = %f\n", count, total / count);
    
        // 파일 종료
        fclose(fp);
    
        return 0;
    
    }
    
    • 결과

    이미지

    • 텍스트 파일

    이미지

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)