파일 입출력과 구조체를 활용한 데이터 처리 실습

1. 파일 통계 분석 (task4)

이 프로그램은 특정 텍스트 파일을 읽어 줄 수와 공백이 아닌 문자 수를 계산합니다. fgetc() 함수로 파일의 문자를 하나씩 읽어 처리합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>

void count_file_stats(const char* filename) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다: %s\n", filename);
        return;
    }
    
    int line_count = 0;
    int char_count = 0;
    int c;
    
    while ((c = fgetc(file)) != EOF) {
        if (c == '\n')
            line_count++;
        if (!isspace(c))
            char_count++;
    }
    
    // 마지막 줄이 개행 문자로 끝나지 않은 경우 처리
    if (char_count > 0)
        line_count++;
    
    fclose(file);
    
    printf("%s 통계 결과:\n", filename);
    printf("줄 수: %d\n", line_count);
    printf("문자 수 (공백 제외): %d\n", char_count);
}

int main() {
    count_file_stats("data4.txt");
    return 0;
}

2. 성적 처리 시스템 (task5)

이 프로그램은 응시자 파일을 읽어 각 학생의 총점을 계산하고 합격 여부를 판단한 후 결과를 파일로 출력합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

#define N 10

typedef struct {
    long id;
    char name[20];
    float objective;
    float subjective;
    float sum;
    char result[10];
} STU;

void read_data(STU st[], int n);
void save_results(STU st[], int n);
void display_all(STU st[], int n);
int evaluate_scores(STU st[], int n, STU passed[]);

int main() {
    STU students[N], passed_students[N];
    int pass_count;
    double pass_rate;

    printf("파일에서 %d명의 응시자 정보를 읽는 중...\n", N);
    read_data(students, N);

    printf("\n성적을 처리하는 중...\n");
    pass_count = evaluate_scores(students, N, passed_students);

    printf("\n합격자 목록:\n");
    display_all(students, N);
    save_results(students, N);

    pass_rate = 1.0 * pass_count / N;
    printf("\n이번 시험 합격률: %.2f%%\n", pass_rate * 100);

    return 0;
}

void display_all(STU st[], int n) {
    int i;
    printf("수험번호\t이름\t객관식\t\t실기\t\t총점\t\t결과\n");
    for (i = 0; i < n; i++)
        printf("%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", 
               st[i].id, st[i].name, st[i].objective, st[i].subjective, st[i].sum, st[i].result);
}

void read_data(STU st[], int n) {
    int i;
    FILE *fin = fopen("examinee.txt", "r");
    if (!fin) {
        printf("파일 열기 실패\n");
        return;
    }
    
    for (i = 0; i < n && !feof(fin); i++)
        fscanf(fin, "%ld %s %f %f", &st[i].id, st[i].name, &st[i].objective, &st[i].subjective);
    
    fclose(fin);
}

void save_results(STU s[], int n) {
    FILE* fp = fopen("list_pass.txt", "w");
    if (!fp) {
        printf("파일 열기 실패\n");
        return;
    }
    
    for (int i = 0; i < n; ++i) {
        if (strcmp(s[i].result, "pass") == 0) {
            fprintf(fp, "%010ld %-20s %.2f %.2f %.2f %s\n", 
                    s[i].id, s[i].name, s[i].objective, s[i].subjective, s[i].sum, s[i].result);
        }
    }
    fclose(fp);
}

int evaluate_scores(STU st[], int n, STU passed[]) {
    for (int i = 0; i < n; ++i) {
        st[i].sum = st[i].objective + st[i].subjective;
        strcpy(st[i].result, (st[i].sum > 60) ? "pass" : "fail");
    }
    
    int j = 0;
    for (int i = 0; i < n; i++) {
        if (strcmp(st[i].result, "pass") == 0) {
            passed[j] = st[i];
            j++;
        }
    }
    return j;
}

3. 무작위 추첨 시스템 (task6)

이 프로그램은 전체 학생 목록에서 지정된 수만큼 무작위로 학생을 선발하여 추첨 결과를 화면과 파일로 출력합니다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define SELECT_COUNT 5
#define TOTAL_STUDENTS 80
#define MAX_STUDENTS 100

typedef struct {
    long student_id;
    char name[20];
    char class_name[40];
} STUDENT;

void select_random(STUDENT pool[], STUDENT result[], int select_n, int total_n);
void load_data(FILE* fp, STUDENT students[], int n);
void print_list(STUDENT arr[], int n);
void save_to_file(STUDENT arr[], int n, char filename[]);

int main() {
    STUDENT selected[SELECT_COUNT], all_students[TOTAL_STUDENTS];
    FILE* fp = fopen("list.txt", "r");
    
    if (!fp) {
        printf("파일 열기 실패\n");
        return 1;
    }
    
    load_data(fp, all_students, TOTAL_STUDENTS);
    fclose(fp);
    
    select_random(all_students, selected, SELECT_COUNT, TOTAL_STUDENTS);
    print_list(selected, SELECT_COUNT);
    
    printf("\n파일로 저장 중...\n");
    char filename[20];
    printf("저장할 파일명 입력: ");
    scanf("%s", filename);
    save_to_file(selected, SELECT_COUNT, filename);
    
    fp = fopen(filename, "r");
    if (fp) {
        printf("저장 성공!\n");
        fclose(fp);
    } else {
        printf("저장 실패!\n");
    }
    
    return 0;
}

void select_random(STUDENT pool[], STUDENT result[], int select_n, int total_n) {
    int used[MAX_STUDENTS] = {0};
    srand((unsigned)time(NULL));
    
    for (int i = 0; i < select_n; ) {
        int idx = rand() % total_n;
        if (!used[idx]) {
            result[i] = pool[idx];
            used[idx] = 1;
            i++;
        }
    }
}

void load_data(FILE* fp, STUDENT students[], int n) {
    for (int i = 0; i < n && !feof(fp); ++i)
        fscanf(fp, "%ld %s %s", &students[i].student_id, students[i].name, students[i].class_name);
}

void print_list(STUDENT arr[], int n) {
    printf("추첨 결과\n");
    for (int i = 0; i < n; ++i)
        printf("%-20ld %-10s %s\n", arr[i].student_id, arr[i].name, arr[i].class_name);
}

void save_to_file(STUDENT arr[], int n, char filename[]) {
    FILE* fp = fopen(filename, "w");
    for (int i = 0; i < n; ++i)
        fprintf(fp, "%-20ld %-15s %s\n", arr[i].student_id, arr[i].name, arr[i].class_name);
    fclose(fp);
}

태그: 파일입출력 구조체 C언어 데이터처리 무작위추출

5월 27일 10:46에 게시됨