C 언어로 문자열을 CSV 파일로 저장하고 불러오는 방법

C 언어에서 데이터를 효율적으로 저장하고 교환하는 방식 중 하나로 CSV 형식을 활용할 수 있습니다. CSV 파일은 간단한 텍스트 형식으로 데이터를 행과 열 형태로 저장하여 다양한 프로그램 간 호환성을 제공합니다. 본 기사에서는 C 언어를 사용하여 문자열 데이터를 CSV 파일로 저장하고 불러오는 방법을 단계별로 설명합니다. 이 과정을 통해 데이터 입출력의 기본 개념부터 실제 응용까지 익힐 수 있습니다.

목차

CSV 형식의 기본 개념


CSV(Comma-Separated Values)는 데이터를 텍스트 형식으로 저장하는 간단한 파일 포맷입니다. 데이터는 쉼표로 구분된 행(row)과 열(column)로 구성되어 있으며, 다양한 플랫폼과 애플리케이션에서 쉽게 사용할 수 있는 장점이 있습니다.

CSV 형식의 구조


CSV 파일은 다음과 같은 구조를 가집니다:

이름,나이,직업  
홍길동,25,프로그래머  
김영희,30,디자이너  

각 행은 레코드(record)를 나타내며, 각 쉼표로 구분된 값은 필드(field)로 구성됩니다.

CSV의 주요 장점

  1. 간단한 형식: 텍스트 기반이므로 읽고 쓰기가 쉽습니다.
  2. 호환성: Excel, 데이터베이스, 프로그래밍 언어 등 다양한 도구와 호환됩니다.
  3. 경량성: JSON이나 XML에 비해 파일 크기가 작아 데이터 교환에 적합합니다.

일반적인 사용 사례

  • 데이터 교환: 서로 다른 소프트웨어 간 데이터 전송.
  • 데이터 저장: 간단한 데이터베이스 대체.
  • 데이터 분석: 스프레드시트 소프트웨어를 활용한 분석 작업.

CSV 형식은 C 언어에서 파일 입출력 학습을 시작하기에 적합하며, 데이터 저장 및 교환의 기본 구조를 이해하는 데 유용합니다.

C 언어에서 파일 입출력 기본


C 언어에서 파일 입출력은 데이터를 파일에 저장하거나 파일에서 읽어오는 데 사용됩니다. 파일 입출력을 구현하기 위해 표준 라이브러리 함수와 파일 포인터를 활용합니다.

파일 입출력의 주요 함수

  1. fopen
  • 파일을 열거나 새로 생성합니다.
  • 구문: FILE *fopen(const char *filename, const char *mode);
  • mode는 파일 접근 모드를 지정하며, 주요 옵션은 다음과 같습니다:
    • "r": 읽기 전용 모드.
    • "w": 쓰기 전용 모드(파일이 없으면 생성, 있으면 덮어씀).
    • "a": 추가 모드(파일이 없으면 생성, 있으면 내용 뒤에 추가).
  1. fprintf
  • 파일에 형식화된 데이터를 씁니다.
  • 구문: int fprintf(FILE *stream, const char *format, ...);
  1. fscanf
  • 파일에서 형식화된 데이터를 읽어옵니다.
  • 구문: int fscanf(FILE *stream, const char *format, ...);
  1. fclose
  • 파일을 닫아 자원을 해제합니다.
  • 구문: int fclose(FILE *stream);

기본 파일 입출력 예제

#include <stdio.h>

int main() {
    FILE *file = fopen("example.csv", "w"); // 쓰기 모드로 파일 열기
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fprintf(file, "이름,나이,직업\n"); // CSV 형식으로 데이터 쓰기
    fprintf(file, "홍길동,25,프로그래머\n");
    fprintf(file, "김영희,30,디자이너\n");

    fclose(file); // 파일 닫기
    printf("데이터가 파일에 저장되었습니다.\n");
    return 0;
}

파일 입출력의 중요성


파일 입출력은 데이터를 영구적으로 저장하거나 외부 프로그램과 교환하는 데 필수적입니다. C 언어에서 기본적인 파일 처리 기술을 익히는 것은 더 복잡한 데이터 관리 작업의 기초가 됩니다.

문자열을 CSV 형식으로 저장하기


C 언어에서는 문자열 데이터를 CSV 파일에 저장하기 위해 파일 입출력 함수를 사용합니다. 각 문자열을 쉼표로 구분하여 한 줄씩 저장하면, CSV 형식에 맞는 파일을 생성할 수 있습니다.

기본 코드 예제


다음은 문자열 데이터를 CSV 파일로 저장하는 간단한 예제입니다.

#include <stdio.h>

int main() {
    // CSV 파일 열기
    FILE *file = fopen("data.csv", "w");
    if (file == NULL) {
        printf("파일을 생성할 수 없습니다.\n");
        return 1;
    }

    // CSV 헤더 쓰기
    fprintf(file, "이름,나이,직업\n");

    // 문자열 데이터 쓰기
    fprintf(file, "홍길동,25,프로그래머\n");
    fprintf(file, "김영희,30,디자이너\n");
    fprintf(file, "박철수,28,엔지니어\n");

    // 파일 닫기
    fclose(file);

    printf("문자열이 CSV 형식으로 저장되었습니다.\n");
    return 0;
}

코드 설명

  1. 파일 열기
    fopen 함수를 사용하여 data.csv 파일을 쓰기 모드("w")로 엽니다. 파일이 없으면 생성되고, 기존 파일이 있다면 덮어씁니다.
  2. CSV 헤더 쓰기
    첫 번째 줄에 이름,나이,직업과 같은 헤더를 작성하여 데이터를 구조화합니다.
  3. 데이터 쓰기
    fprintf 함수를 사용하여 각 레코드를 쉼표로 구분된 문자열로 작성합니다.
  4. 파일 닫기
    fclose 함수로 파일을 닫아 시스템 자원을 해제합니다.

응용: 동적 데이터 저장


사용자로부터 데이터를 입력받아 CSV 파일에 저장하는 예제입니다.

#include <stdio.h>

int main() {
    FILE *file = fopen("user_data.csv", "w");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fprintf(file, "이름,나이,직업\n");

    char name[50], job[50];
    int age;
    for (int i = 0; i < 3; i++) {
        printf("이름: ");
        scanf("%49s", name);
        printf("나이: ");
        scanf("%d", &age);
        printf("직업: ");
        scanf("%49s", job);

        fprintf(file, "%s,%d,%s\n", name, age, job);
    }

    fclose(file);
    printf("입력된 데이터가 CSV 파일에 저장되었습니다.\n");
    return 0;
}

코드 실행 결과


사용자가 입력한 데이터가 아래와 같은 형식으로 저장됩니다:

이름,나이,직업  
홍길동,25,프로그래머  
김영희,30,디자이너  
박철수,28,엔지니어  

주요 포인트

  • 쉼표(,)로 데이터를 구분하여 CSV 형식을 준수합니다.
  • fprintf를 사용해 형식화된 문자열을 작성합니다.
  • 파일 작업이 끝나면 반드시 fclose로 파일을 닫아야 합니다.

이 방법을 통해 문자열 데이터를 손쉽게 CSV 파일로 저장할 수 있습니다.

CSV 파일에서 문자열 읽어오기


CSV 파일에 저장된 데이터를 읽어와서 프로그램에서 활용하는 방법은 데이터를 관리하고 처리하는 데 중요한 기술입니다. C 언어에서는 fopen, fscanf, fgets 같은 함수를 활용해 CSV 데이터를 효율적으로 읽어올 수 있습니다.

기본 코드 예제


다음은 CSV 파일에서 데이터를 읽고 출력하는 간단한 예제입니다.

#include <stdio.h>

int main() {
    // CSV 파일 열기
    FILE *file = fopen("data.csv", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    char buffer[256]; // 데이터를 저장할 버퍼

    // 첫 줄(헤더) 읽기
    if (fgets(buffer, sizeof(buffer), file)) {
        printf("헤더: %s", buffer);
    }

    // 데이터 읽기
    while (fgets(buffer, sizeof(buffer), file)) {
        printf("데이터: %s", buffer);
    }

    // 파일 닫기
    fclose(file);

    printf("CSV 파일 읽기가 완료되었습니다.\n");
    return 0;
}

코드 설명

  1. 파일 열기
    fopen 함수로 data.csv 파일을 읽기 모드("r")로 엽니다. 파일이 없으면 NULL을 반환합니다.
  2. 헤더 처리
    CSV 파일의 첫 줄은 일반적으로 헤더로 구성되므로, 이를 읽어서 별도로 처리할 수 있습니다.
  3. 데이터 읽기
    fgets 함수는 한 줄씩 데이터를 읽어옵니다. 읽어온 데이터를 버퍼(char array)에 저장하여 화면에 출력합니다.
  4. 파일 닫기
    fclose 함수로 파일을 닫아 자원을 해제합니다.

구체적인 데이터 파싱 예제


CSV 데이터를 쉼표로 구분하여 개별 값으로 추출하는 코드 예제입니다.

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

int main() {
    FILE *file = fopen("data.csv", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    char buffer[256]; // 데이터를 저장할 버퍼
    char *token;

    // 헤더 읽기
    fgets(buffer, sizeof(buffer), file);

    // 데이터 읽기
    while (fgets(buffer, sizeof(buffer), file)) {
        // 쉼표를 기준으로 데이터 분리
        token = strtok(buffer, ",");
        while (token != NULL) {
            printf("필드: %s\n", token);
            token = strtok(NULL, ",");
        }
    }

    fclose(file);

    printf("CSV 데이터 파싱이 완료되었습니다.\n");
    return 0;
}

코드 실행 결과


CSV 파일(data.csv)에 아래와 같은 데이터가 있을 경우:

이름,나이,직업  
홍길동,25,프로그래머  
김영희,30,디자이너  
박철수,28,엔지니어  

프로그램 출력:

필드: 홍길동  
필드: 25  
필드: 프로그래머  
필드: 김영희  
필드: 30  
필드: 디자이너  
필드: 박철수  
필드: 28  
필드: 엔지니어  

주요 포인트

  • fgets를 사용하여 줄 단위로 읽어오고, strtok를 사용해 쉼표로 데이터를 구분합니다.
  • 데이터의 각 필드를 개별적으로 처리할 수 있습니다.
  • CSV 파일 구조를 잘 이해하고 헤더와 데이터를 구분하여 다룹니다.

이 방법을 통해 CSV 파일에서 데이터를 읽고 구조화된 방식으로 활용할 수 있습니다.

파일 처리 시 발생할 수 있는 문제 해결


CSV 파일 입출력 과정에서 발생할 수 있는 문제를 이해하고 이를 해결하는 방법은 안정적인 프로그램 개발의 핵심입니다. 아래는 일반적인 문제와 그 해결 방법을 다룹니다.

1. 파일 열기 실패

문제 원인

  • 파일이 존재하지 않거나 권한 부족.
  • 잘못된 경로 입력.
  • 읽기/쓰기 모드 오류.

해결 방법

  • fopen 함수 호출 후 반환값이 NULL인지 확인합니다.
  • 경로와 파일명을 정확히 입력하고, 파일 권한을 점검합니다.
  • 적절한 파일 모드(r, w, a)를 선택합니다.
FILE *file = fopen("data.csv", "r");
if (file == NULL) {
    perror("파일 열기 오류");
    return 1;
}

2. 데이터 파싱 오류

문제 원인

  • 쉼표가 데이터 값에 포함된 경우.
  • 빈 필드 또는 잘못된 데이터 형식.

해결 방법

  • 데이터를 읽을 때 따옴표로 묶인 값을 처리하도록 설계합니다.
  • 각 필드의 유효성을 검증하고, 누락된 데이터를 기본값으로 처리합니다.
char *token = strtok(buffer, ",");
while (token != NULL) {
    if (token[0] == '"') {
        // 따옴표로 묶인 데이터 처리
    }
    token = strtok(NULL, ",");
}

3. 파일 닫기 누락

문제 원인

  • 프로그램 종료 시 파일 포인터를 닫지 않아 리소스 누수가 발생.

해결 방법

  • 모든 파일 작업이 끝난 후 반드시 fclose를 호출합니다.
fclose(file);

4. 메모리 초과

문제 원인

  • 큰 파일 처리 시 고정 크기 배열 사용.
  • 동적 메모리를 제대로 해제하지 않음.

해결 방법

  • 동적 메모리 할당을 사용하고, 작업 후 메모리를 해제합니다.
char *buffer = malloc(1024);
if (buffer == NULL) {
    printf("메모리 할당 실패\n");
    return 1;
}
free(buffer);

5. 데이터 손실

문제 원인

  • 쓰기 작업 중 프로그램이 중단되거나 데이터를 누락.

해결 방법

  • 데이터를 쓰기 전에 항상 출력 버퍼를 비웁니다.
fflush(file);

6. 멀티플랫폼 간 호환성 문제

문제 원인

  • 파일의 개행 문자 차이(Linux: \n, Windows: \r\n).

해결 방법

  • 파일을 바이너리 모드로 읽거나 쓰기("rb", "wb")로 처리합니다.
FILE *file = fopen("data.csv", "wb");

7. 디버깅 도구 활용


파일 처리 오류가 발생했을 때, 디버깅 도구를 사용하여 파일 상태를 점검합니다.

디버깅 체크리스트

  1. 파일 포인터가 NULL인지 확인.
  2. 데이터를 읽거나 쓸 때 예상 결과와 비교.
  3. 디버거로 파일 입출력 함수 호출 추적.

결론


파일 입출력 작업에서 발생하는 문제를 사전에 방지하고 해결하는 기술은 안정적이고 효율적인 데이터 처리를 위한 필수 요소입니다. 각 문제를 코드와 함께 실습하여 보다 강력한 프로그램을 설계할 수 있습니다.

동적 메모리와 문자열 배열 사용


C 언어에서 문자열 데이터를 효율적으로 관리하려면 동적 메모리와 문자열 배열을 적절히 활용해야 합니다. 특히, CSV 파일에서 다양한 크기의 문자열 데이터를 처리할 때 동적 메모리 할당은 유용합니다.

동적 메모리 할당의 필요성

  • 정적인 배열 크기로는 유동적인 데이터 크기를 처리하기 어려움.
  • 동적 메모리를 사용하면 데이터 크기에 따라 적절히 메모리를 할당할 수 있음.

기본 동적 메모리 사용법


mallocfree를 사용하여 메모리를 동적으로 할당하고 해제합니다.

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *buffer = malloc(256); // 256바이트 메모리 할당
    if (buffer == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    // 메모리 사용
    snprintf(buffer, 256, "Hello, dynamic memory!");
    printf("%s\n", buffer);

    // 메모리 해제
    free(buffer);
    return 0;
}

문자열 배열 사용


동적 메모리를 활용한 문자열 배열은 CSV 파일에서 여러 개의 문자열 데이터를 처리할 때 유용합니다.

예제: 문자열 배열 관리

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int rowCount = 3; // 문자열 개수
    char **rows = malloc(rowCount * sizeof(char *)); // 문자열 배열 할당
    if (rows == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    // 각 문자열 동적 할당 및 초기화
    for (int i = 0; i < rowCount; i++) {
        rows[i] = malloc(256);
        if (rows[i] == NULL) {
            printf("메모리 할당 실패\n");
            return 1;
        }
        snprintf(rows[i], 256, "Row %d: Sample data", i + 1);
    }

    // 데이터 출력
    for (int i = 0; i < rowCount; i++) {
        printf("%s\n", rows[i]);
    }

    // 메모리 해제
    for (int i = 0; i < rowCount; i++) {
        free(rows[i]);
    }
    free(rows);

    return 0;
}

동적 메모리 관리의 주요 원칙

  1. 메모리 초과 방지: 데이터 크기를 정확히 파악하고 필요한 만큼만 할당합니다.
  2. 할당 후 검증: 메모리가 제대로 할당되었는지 확인합니다.
  3. 메모리 누수 방지: 사용이 끝난 메모리는 반드시 free로 해제합니다.

CSV 데이터 처리 응용

예제: CSV 데이터 저장 및 출력

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int rowCount = 3; // 행 개수
    int columnCount = 3; // 열 개수

    char ***data = malloc(rowCount * sizeof(char **)); // 행 할당
    if (data == NULL) {
        printf("메모리 할당 실패\n");
        return 1;
    }

    // 각 행과 열에 메모리 할당 및 초기화
    for (int i = 0; i < rowCount; i++) {
        data[i] = malloc(columnCount * sizeof(char *)); // 열 할당
        for (int j = 0; j < columnCount; j++) {
            data[i][j] = malloc(50); // 문자열 할당
            snprintf(data[i][j], 50, "Row %d, Col %d", i + 1, j + 1);
        }
    }

    // 데이터 출력
    for (int i = 0; i < rowCount; i++) {
        for (int j = 0; j < columnCount; j++) {
            printf("%s ", data[i][j]);
        }
        printf("\n");
    }

    // 메모리 해제
    for (int i = 0; i < rowCount; i++) {
        for (int j = 0; j < columnCount; j++) {
            free(data[i][j]);
        }
        free(data[i]);
    }
    free(data);

    return 0;
}

결론


동적 메모리와 문자열 배열은 유연한 데이터 처리를 가능하게 합니다. 특히, CSV 파일과 같은 구조화된 데이터를 다룰 때 적절히 활용하면 안정적이고 효율적인 프로그램을 작성할 수 있습니다.

데이터 검증 및 에러 핸들링


CSV 파일 데이터를 처리할 때, 입력 데이터의 유효성을 확인하고 에러를 적절히 처리하는 것은 프로그램의 안정성과 신뢰성을 높이는 데 필수적입니다. 데이터 검증과 에러 핸들링을 체계적으로 설계하는 방법을 살펴봅니다.

데이터 검증

1. 필드 수 검증


CSV 파일의 각 행에서 필드(열)의 개수가 일관된지 확인합니다.

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

void validateFieldCount(const char *line, int expectedFieldCount) {
    int count = 1; // 첫 번째 필드 포함
    for (int i = 0; line[i] != '\0'; i++) {
        if (line[i] == ',') count++;
    }
    if (count != expectedFieldCount) {
        printf("경고: 필드 수가 일치하지 않습니다. (%d 필드 발견)\n", count);
    }
}

int main() {
    const char *sampleLine = "홍길동,25,프로그래머";
    validateFieldCount(sampleLine, 3);
    return 0;
}

2. 데이터 타입 검증


각 필드의 데이터 타입이 예상과 일치하는지 확인합니다.

#include <ctype.h>
#include <stdbool.h>

bool isNumber(const char *str) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (!isdigit(str[i])) return false;
    }
    return true;
}

int main() {
    const char *age = "25";
    if (isNumber(age)) {
        printf("유효한 숫자입니다: %s\n", age);
    } else {
        printf("숫자가 아닙니다: %s\n", age);
    }
    return 0;
}

3. 데이터 값 범위 검증


숫자 또는 특정 범위의 값을 갖는 필드에 대해 범위를 검증합니다.

#include <stdio.h>
#include <stdbool.h>

bool isInRange(int value, int min, int max) {
    return value >= min && value <= max;
}

int main() {
    int age = 25;
    if (isInRange(age, 0, 120)) {
        printf("유효한 나이입니다: %d\n", age);
    } else {
        printf("나이 값이 유효하지 않습니다: %d\n", age);
    }
    return 0;
}

에러 핸들링

1. 파일 입출력 에러 처리


파일을 열거나 읽을 때 문제가 발생하면 사용자에게 명확한 오류 메시지를 제공합니다.

FILE *file = fopen("data.csv", "r");
if (file == NULL) {
    perror("파일 열기 오류");
    return 1;
}

2. 빈 필드 처리


CSV 파일에 빈 필드가 포함될 경우 기본값으로 처리합니다.

char *field = strtok(buffer, ",");
if (field == NULL || strcmp(field, "") == 0) {
    printf("경고: 빈 필드 발견. 기본값으로 설정합니다.\n");
    field = "Unknown";
}

3. 로그 출력


검증 실패 또는 오류 상황에서 로그를 남겨 디버깅에 활용합니다.

#include <stdio.h>

void logError(const char *message) {
    FILE *logFile = fopen("error.log", "a");
    if (logFile == NULL) {
        printf("로그 파일을 열 수 없습니다.\n");
        return;
    }
    fprintf(logFile, "오류: %s\n", message);
    fclose(logFile);
}

int main() {
    logError("필드 수 불일치");
    return 0;
}

결론


데이터 검증과 에러 핸들링은 신뢰할 수 있는 CSV 데이터 처리를 보장합니다. 필드 수, 데이터 타입, 값 범위를 철저히 검증하고 발생 가능한 모든 에러 상황에 대해 적절한 조치를 취함으로써 데이터 품질을 높이고 프로그램의 안정성을 확보할 수 있습니다.

실제 응용 예제: 학생 성적 관리


C 언어로 학생 성적 데이터를 CSV 파일에 저장하고 불러오는 실제 응용 예제를 통해 CSV 처리 기술을 연습합니다. 이 예제는 데이터를 입력받아 저장하고, 저장된 데이터를 읽어와 분석하는 과정을 포함합니다.


1. 학생 데이터 입력 및 CSV 파일 저장

다음 코드는 사용자로부터 학생 정보를 입력받아 CSV 파일에 저장합니다.

#include <stdio.h>

typedef struct {
    char name[50];
    int score;
} Student;

int main() {
    FILE *file = fopen("students.csv", "w");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fprintf(file, "이름,성적\n"); // CSV 헤더 작성

    Student students[3]; // 학생 데이터 배열
    for (int i = 0; i < 3; i++) {
        printf("학생 %d 이름: ", i + 1);
        scanf("%49s", students[i].name);
        printf("학생 %d 성적: ", i + 1);
        scanf("%d", &students[i].score);

        fprintf(file, "%s,%d\n", students[i].name, students[i].score); // CSV 파일에 저장
    }

    fclose(file);
    printf("학생 데이터가 students.csv에 저장되었습니다.\n");
    return 0;
}

2. CSV 파일 읽기 및 데이터 출력

저장된 학생 데이터를 CSV 파일에서 읽어와 출력하는 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    FILE *file = fopen("students.csv", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    char buffer[256];
    fgets(buffer, sizeof(buffer), file); // 헤더 읽기

    printf("학생 데이터:\n");
    while (fgets(buffer, sizeof(buffer), file)) {
        char *name = strtok(buffer, ",");
        char *score = strtok(NULL, ",");
        if (name && score) {
            printf("이름: %s, 성적: %s", name, score); // 데이터 출력
        }
    }

    fclose(file);
    return 0;
}

3. 데이터 분석: 평균 성적 계산

CSV 파일 데이터를 읽어와 평균 성적을 계산하는 코드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    FILE *file = fopen("students.csv", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    char buffer[256];
    fgets(buffer, sizeof(buffer), file); // 헤더 읽기

    int totalScore = 0, studentCount = 0;
    while (fgets(buffer, sizeof(buffer), file)) {
        strtok(buffer, ","); // 이름 무시
        char *scoreStr = strtok(NULL, ",");
        if (scoreStr) {
            totalScore += atoi(scoreStr);
            studentCount++;
        }
    }

    fclose(file);

    if (studentCount > 0) {
        printf("평균 성적: %.2f\n", (double)totalScore / studentCount);
    } else {
        printf("학생 데이터가 없습니다.\n");
    }

    return 0;
}

결과

  1. 입력한 데이터가 CSV 파일에 저장됩니다.
   이름,성적
   홍길동,85
   김영희,90
   박철수,78
  1. CSV 파일에서 데이터를 읽어와 출력합니다.
   학생 데이터:
   이름: 홍길동, 성적: 85
   이름: 김영희, 성적: 90
   이름: 박철수, 성적: 78
  1. 평균 성적을 계산하여 출력합니다.
   평균 성적: 84.33

결론


학생 성적 관리 예제를 통해 CSV 데이터를 저장하고 불러오는 방법뿐 아니라, 데이터를 읽어와 분석하는 과정까지 학습할 수 있습니다. 이 실습을 통해 CSV 파일 입출력과 데이터 처리 기술을 더욱 탄탄히 익힐 수 있습니다.

요약


본 기사에서는 C 언어를 활용하여 문자열 데이터를 CSV 형식으로 저장하고 불러오는 방법을 설명했습니다. CSV 파일의 기본 구조와 장점을 시작으로, 파일 입출력, 동적 메모리 사용, 데이터 검증, 에러 핸들링, 그리고 실질적인 학생 성적 관리 응용 예제까지 다루었습니다. 이 과정을 통해 CSV 파일 처리 기술을 익히고, 데이터를 효과적으로 관리하고 분석하는 능력을 키울 수 있습니다.

목차