성적처리 프로그램 파일입출력

조회수 3114회

성적처리 프로그램입니다. 함수와 포인터로 만들어진 코드에서 파일입출력을 추가하려고 합니다. '성적처리 프로그램.txt'파일에

1111 가가가 100 99 98 97

2222 나나나 90 89 88 87

3333 다다다 80 79 78 77

이렇게 3줄로 학번, 이름, 점수 4개를 작성해놨습니다. 그러고 나서

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define SUB 4
char subname[SUB][6] = { "국어", "영어", "수학", "C언어" };
struct STUDENT {
    char id[5];
    char name[7];
    int score[SUB + 1];
    float avg;
    char alpha;
    int rank;
};
void input(struct STUDENT *stu, int PEOPLE) {
    FILE *fp;
    fp = fopen("성적처리 프로그램.txt", "w+");
    //char buffer[50];

    for (int i = 0; i < PEOPLE; i++) {
        fscanf(fp, "%s %s %d %d %d %d", (stu + i)->id, (stu + i)->name, &(stu+i)->score[0], &(stu + i)->score[1], &(stu + i)->score[2], &(stu + i)->score[3]);
        //fscanf(fp, "%s %s %d %d %d %d", stu[i].id, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]);
    }

    /*for (int i = 0; i < PEOPLE; i++) {
        fscanf(fp, "%s\n", (stu + i)->id);
        fscanf(fp, "%s\n", (stu + i)->name);
        for (int j = 0; j < SUB; j++) {
            fscanf(fp, "%d\n", &(stu + i)->score[j]);
        }
    }*/

    fclose(fp);
} //입력함수
void calculation(struct STUDENT *stu, int PEOPLE) {
    for (int i = 0; i < PEOPLE; i++) {
        (stu + i)->score[SUB] = 0;
        for (int j = 0; j < SUB; j++) {
            (stu + i)->score[SUB] += (stu + i)->score[j];
        } //총점
        (stu + i)->avg = (float)(stu + i)->score[SUB] / SUB; //평균
    }
} //계산함수
void line() {
    for (int i = 0; i < 75; i++) {
        printf("-");
    }
    printf("\n");
}
void print(struct STUDENT *stu, int PEOPLE) {
    printf("\n");
    line();
    printf("  학번    이름     국어   영어   수학   c언어   총점   평균    등급  석차\n");
    //fprintf(fp, "  학번    이름     국어   영어   수학   c언어   총점   평균    등급  석차\n");
    line();
    for (int i = 0; i < PEOPLE; i++) {
        printf("%6s %8s", (stu + i)->id, (stu + i)->name);
        //fprintf(fp, "%6s %8s", (stu + i)->id, (stu + i)->name);
        for (int j = 0; j < SUB; j++) {
            printf("%7d", (stu + i)->score[j]);
            //fprintf(fp, "%7d", (stu + i)->score[j]);
        }
        printf("%8d  %7.2f %5c  %4d\n", (stu + i)->score[SUB], (stu + i)->avg, (stu + i)->alpha, (stu + i)->rank);
        //fprintf(fp, "%8d  %7.2f %5c  %4d\n", (stu + i)->score[SUB], (stu + i)->avg, (stu + i)->alpha, (stu + i)->rank);
    }
    line();
} //출력함수
int main() {
    int PEOPLE;
    int ban_total[SUB + 1] = { 0 };
    double ban_avg[SUB + 1] = { 0 };

    printf("몇명을 입력하시겠습니까? ");
    scanf("%d", &PEOPLE);
    struct STUDENT *stu = (struct STUDENT *)malloc(sizeof(struct STUDENT)*PEOPLE);

    input(stu, PEOPLE); //입력
    calculation(stu, PEOPLE); //계산

    for (int i = 0; i < SUB; i++) {
        for (int j = 0; j < PEOPLE; j++) {
            ban_total[i] += (stu + j)->score[i];
        } //과목 총점
        ban_avg[i] = (float)ban_total[i] / PEOPLE; //과목 평균
    }

    for (int i = 0; i < PEOPLE; i++) {
        switch ((int)(stu + i)->avg / 10) {
        case 10: case 9: (stu + i)->alpha = 'A'; break;
        case 8: (stu + i)->alpha = 'B'; break;
        case 7: (stu + i)->alpha = 'C'; break;
        case 6: (stu + i)->alpha = 'D'; break;
        default: (stu + i)->alpha = 'F'; break;
        } //등급
    }
    for (int i = 0; i < PEOPLE; i++) {
        (stu + i)->rank = 1;
    } //석차 1로 초기화
    for (int i = 0; i < PEOPLE; i++) {
        for (int j = i + 1; j < PEOPLE; j++) {
            if ((stu + i)->avg < (stu + j)->avg) {
                (stu + i)->rank++;
            }
            else {
                (stu + j)->rank++;
            }
        }
    }//석차 계산

    print(stu, PEOPLE);
    printf("                    ");
    //fprintf(fp, "                         ");
    for (int i = 0; i < SUB; i++) {
        printf("%-7d", ban_total[i]);
        //fprintf(fp, "%-7d", ban_total[i]);
    }//과목별 총점
    printf("\n");
    //fprintf(fp, "\n");
    printf("                    ");
    //fprintf(fp, "                         ");
    for (int i = 0; i < SUB; i++) {
        printf("%-7.1lf", ban_avg[i]);
        //fprintf(fp, "%-7.1lf", ban_avg[i]);
    }//과목별 평균
    printf("\n");
    //fprintf(fp, "\n");
    //line(fp);

    //fclose(fp);
}

다음과 같은 코드를 실행하였습니다. 그런데 이미지 이렇게 쓰레기값만 나옵니다. 뭐가 문제고 어떻게 고쳐야돼나요? 알려주시면 좋겠습니다.

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

1 답변

  • 파일을 open 하실 때 w+ 모드로 하셨는데 w, w+ 모드는 파일이 존재하더라도 새로운 파일을 생성해서 덮어쓰게 됩니다. 따라서 비어있는 파일에서 fscanf 로 읽어오는 형국이라 데이터를 제대로 읽어오지 못한겁니다.

    이미 존재하는 파일의 데이터를 읽을 때는 r 모드로 open 해주시구요, 수정도 해야 한다 하시면 r+ 모드로 open 하시면 됩니다.

    나머지 코드는 다 맞게 하셔서 r 모드로만 변경하시면 동작할겁니다.

    참고로 말씀드리면 (stu + i)->idstu[i].id 는 동치이므로 둘다 맞는 코드입니다.

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)