C 언어로 파일을 활용한 간단한 데이터베이스 구현 방법

목차

도입 문구


C 언어를 사용하여 파일을 기반으로 간단한 데이터베이스 시스템을 구현하는 방법을 소개합니다. 이 방법은 데이터 저장, 검색, 수정 및 삭제 작업을 파일로 처리하여 실제 데이터베이스 시스템처럼 사용할 수 있도록 도와줍니다.

파일을 사용한 데이터베이스 구현의 필요성


파일을 사용한 데이터베이스 구현은 데이터베이스 시스템의 기본적인 원리를 이해하고 실습하는 데 유용합니다. 데이터베이스 관리 시스템(DBMS)은 일반적으로 복잡한 데이터베이스 구조를 효율적으로 처리하는 소프트웨어이지만, 파일 기반 데이터베이스 시스템을 통해 간단한 데이터 관리 작업을 직접 구현하는 것은 프로그래밍 실력을 키우는 데 큰 도움이 됩니다. 또한, 작은 프로젝트나 학습 목적으로 파일 기반 데이터베이스를 사용하면, 시스템 자원 소모를 최소화하면서도 실용적인 데이터 관리 방식을 구현할 수 있습니다.

C 언어에서 파일 처리 방법


C 언어에서는 파일을 다루기 위해 stdio.h 헤더 파일에 정의된 여러 가지 함수를 사용합니다. 파일을 열고, 읽고, 쓰는 작업을 처리할 수 있는 기본적인 함수들은 다음과 같습니다.

파일 열기


파일을 열기 위해 fopen() 함수를 사용합니다. 이 함수는 파일 이름과 파일을 열 때 사용할 모드를 인수로 받습니다. 모드는 파일을 어떻게 처리할지를 결정하는 값으로, 예를 들어 읽기 모드(“r”), 쓰기 모드(“w”), 추가 모드(“a”) 등이 있습니다.

FILE *file = fopen("database.txt", "w");

파일 읽기


파일에서 데이터를 읽기 위해 fscanf()fgets()와 같은 함수를 사용합니다. fscanf()는 포맷에 맞춰 데이터를 읽는 반면, fgets()는 한 줄씩 문자열을 읽습니다.

char line[100];
fgets(line, sizeof(line), file);

파일 쓰기


파일에 데이터를 쓸 때는 fprintf()fputs() 함수를 사용합니다. fprintf()는 포맷을 사용하여 데이터를 출력할 수 있으며, fputs()는 문자열을 그대로 출력합니다.

fprintf(file, "학생: %s, 점수: %d\n", name, score);

파일 닫기


파일 작업이 끝난 후에는 fclose() 함수를 사용하여 파일을 닫아야 합니다. 파일을 닫지 않으면 데이터가 저장되지 않을 수 있습니다.

fclose(file);

파일 처리는 C 언어에서 데이터를 영구적으로 저장하고 관리할 수 있게 해주는 중요한 기능입니다. 이를 통해 간단한 데이터베이스 시스템을 구현할 수 있습니다.

데이터베이스 기본 구조 설계


파일을 활용한 데이터베이스를 설계할 때, 데이터가 어떻게 저장되고 관리될지를 결정하는 것이 중요합니다. C 언어로 간단한 데이터베이스를 구현하려면 데이터를 저장할 구조체를 정의하고, 이를 파일에 저장하는 방식을 고려해야 합니다.

구조체 정의


먼저, 데이터베이스에 저장할 데이터를 표현하기 위한 구조체를 정의합니다. 예를 들어, 학생 정보를 저장하는 데이터베이스를 만든다고 가정할 때, 학생의 이름과 점수를 저장하는 구조체를 정의할 수 있습니다.

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

이 구조체는 학생의 이름과 점수 정보를 저장합니다. 데이터베이스에 저장할 항목이 많아질 경우, 구조체에 추가적인 필드를 넣어 확장할 수 있습니다.

파일 형식 결정


파일에 데이터를 저장할 때, 데이터를 어떻게 구조화할지 결정해야 합니다. 각 레코드는 하나의 구조체 인스턴스를 나타내며, 파일에 순차적으로 기록됩니다. 파일을 텍스트 형식으로 저장하거나 바이너리 형식으로 저장할 수 있습니다. 텍스트 파일은 사람이 읽을 수 있기 때문에 디버깅이 쉬운 반면, 바이너리 파일은 성능이 더 우수하고 파일 크기가 작을 수 있습니다.

파일에서의 데이터 저장 형식


학생 정보를 저장할 때, 각 학생의 데이터를 구조체 형식으로 저장하고 파일에 기록합니다. 이 데이터를 저장하는 방법은 텍스트 파일로는 아래와 같이 처리할 수 있습니다.

FILE *file = fopen("students.txt", "w");
struct Student student1 = {"Alice", 85};
fprintf(file, "%s %d\n", student1.name, student1.score);
fclose(file);

위의 예시에서, fprintf() 함수를 사용하여 학생의 이름과 점수를 텍스트 형식으로 파일에 기록합니다. 이와 같은 방식으로 파일에 여러 학생 정보를 순차적으로 저장할 수 있습니다.

데이터베이스 구조 설계는 프로젝트의 요구사항에 맞춰 파일에 어떤 데이터를 저장할지 정의하고, 이를 어떻게 효율적으로 처리할지를 결정하는 중요한 단계입니다.

파일에 데이터 저장하기


파일에 데이터를 저장하는 과정은 매우 중요하며, 이 단계에서는 데이터를 어떻게 파일에 기록할지에 대해 구체적으로 다루게 됩니다. C 언어에서 데이터를 파일에 저장하는 방법은 주로 fwrite()fprintf()와 같은 함수로 처리할 수 있습니다. 여기에서는 간단한 텍스트 파일 형식을 사용하여 데이터를 저장하는 방법을 설명합니다.

구조체 데이터를 파일에 저장하기


파일에 데이터를 저장하려면, 먼저 데이터를 구조체 형식으로 저장한 후 이를 파일에 작성하는 방식으로 진행됩니다. 예를 들어, 학생 정보를 저장하는 데이터베이스를 구현한다고 가정했을 때, 구조체를 사용하여 데이터를 저장하고, 그 데이터를 파일에 저장하는 방법은 다음과 같습니다.

#include <stdio.h>

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

int main() {
    struct Student student1 = {"Alice", 85};
    FILE *file = fopen("students.txt", "a"); // 파일을 추가 모드로 열기

    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fprintf(file, "%s %d\n", student1.name, student1.score); // 학생 정보 저장
    fclose(file); // 파일 닫기

    return 0;
}

이 코드에서는 fopen() 함수로 파일을 “a” 모드로 열어, 데이터를 기존 파일 뒤에 추가할 수 있도록 합니다. fprintf() 함수로 학생의 이름과 점수를 텍스트 형식으로 파일에 기록한 후, fclose()로 파일을 닫습니다. 파일이 성공적으로 열리지 않으면 오류 메시지가 출력됩니다.

다수의 데이터 저장하기


여러 개의 학생 데이터를 저장하려면, 배열이나 동적 메모리 할당을 사용하여 여러 학생 정보를 저장할 수 있습니다. 예를 들어, 3명의 학생 정보를 저장하려면 다음과 같이 처리할 수 있습니다.

#include <stdio.h>

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

int main() {
    struct Student students[3] = {
        {"Alice", 85},
        {"Bob", 92},
        {"Charlie", 78}
    };

    FILE *file = fopen("students.txt", "w"); // 파일을 쓰기 모드로 열기

    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    for (int i = 0; i < 3; i++) {
        fprintf(file, "%s %d\n", students[i].name, students[i].score); // 각 학생 정보 저장
    }

    fclose(file); // 파일 닫기
    return 0;
}

이 예시에서는 배열을 사용하여 3명의 학생 정보를 저장하고, 반복문을 통해 각 학생의 데이터를 파일에 기록합니다. 이렇게 하면 다수의 데이터를 손쉽게 저장할 수 있습니다.

파일 저장 시 주의점

  • 파일 모드 선택: 파일을 “w” 모드로 열면 기존 데이터가 덮어쓰여지므로, 데이터를 추가하려면 “a” 모드를 사용해야 합니다.
  • 오류 처리: 파일이 제대로 열리지 않는 경우를 대비하여 오류 처리를 해주는 것이 중요합니다. fopen() 함수에서 파일이 열리지 않으면 NULL을 반환합니다.
  • 파일 닫기: 작업이 끝난 후에는 반드시 fclose()를 사용하여 파일을 닫아야 합니다. 그렇지 않으면 데이터가 파일에 반영되지 않거나, 리소스가 누수될 수 있습니다.

파일에 데이터를 저장하는 과정은 간단하지만, 파일의 읽기, 쓰기 작업을 올바르게 처리하는 것이 중요합니다.

파일에서 데이터 읽기


파일에 저장된 데이터를 읽어오는 과정은 데이터베이스에서 중요한 역할을 합니다. C 언어에서는 fscanf(), fgets(), fread() 등의 함수를 사용하여 파일에서 데이터를 읽을 수 있습니다. 이 섹션에서는 파일에서 데이터를 읽는 방법을 구체적으로 설명합니다.

텍스트 파일에서 데이터 읽기


파일에서 데이터를 읽을 때, 일반적으로 fscanf()fgets()와 같은 함수를 사용합니다. fscanf()는 형식에 맞춰 데이터를 읽어오고, fgets()는 한 줄씩 데이터를 읽습니다.

#include <stdio.h>

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

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

    struct Student student;

    // 파일에서 학생 정보 한 줄씩 읽기
    while (fscanf(file, "%s %d", student.name, &student.score) != EOF) {
        printf("학생 이름: %s, 점수: %d\n", student.name, student.score);
    }

    fclose(file); // 파일 닫기
    return 0;
}

위 코드에서는 fscanf()를 사용하여 파일에서 학생 이름과 점수를 읽어옵니다. 파일이 끝날 때까지 while 루프를 사용하여 데이터를 계속 읽습니다. EOF(End of File)는 파일의 끝을 나타내는 특별한 값으로, 파일이 끝날 때 루프가 종료됩니다.

파일에서 한 줄씩 읽기


fgets()를 사용하면 파일에서 한 줄씩 문자열을 읽어올 수 있습니다. fgets()는 개행 문자를 포함하여 한 줄을 읽기 때문에, 그 후 개행 문자를 제거하는 작업이 필요할 수 있습니다.

#include <stdio.h>

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

    char line[100];
    while (fgets(line, sizeof(line), file) != NULL) {
        printf("읽은 줄: %s", line);
    }

    fclose(file); // 파일 닫기
    return 0;
}

fgets()는 한 번에 한 줄을 읽으며, 읽은 문자열을 출력하는 예시입니다. 이 방법은 파일의 내용이 사람이 읽을 수 있는 형태로 저장되어 있을 때 유용합니다.

파일에서 바이너리 데이터 읽기


바이너리 파일에서 데이터를 읽는 경우, fread() 함수를 사용합니다. fread()는 파일에서 바이너리 데이터를 구조체나 배열에 직접 읽어옵니다.

#include <stdio.h>

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

int main() {
    FILE *file = fopen("students.dat", "rb"); // 바이너리 읽기 모드로 파일 열기
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    struct Student student;
    while (fread(&student, sizeof(struct Student), 1, file) == 1) {
        printf("학생 이름: %s, 점수: %d\n", student.name, student.score);
    }

    fclose(file); // 파일 닫기
    return 0;
}

fread()는 바이너리 파일에서 구조체 크기만큼 데이터를 읽어옵니다. 이 방법은 텍스트 파일보다 효율적이고 빠르며, 파일 크기도 더 작게 유지할 수 있습니다.

파일 읽기 시 주의점

  • 파일 끝 확인: 파일에서 데이터를 읽을 때는 반드시 EOFNULL을 통해 파일 끝을 확인해야 합니다.
  • 읽기 오류 처리: 파일을 읽는 도중 오류가 발생할 수 있으므로, 파일이 정상적으로 열렸는지 확인하고, 읽은 데이터가 정확한지 점검해야 합니다.
  • 파일 형식 맞추기: 데이터를 읽을 때는 파일에 저장된 형식과 일치하는 방식으로 데이터를 읽어야 오류를 방지할 수 있습니다.

파일에서 데이터를 읽는 과정은 파일 입출력에서 핵심적인 작업으로, 적절한 방법을 선택하여 효율적으로 데이터를 처리할 수 있습니다.

데이터 검색 및 수정


파일에 저장된 데이터를 검색하고 수정하는 과정은 데이터베이스 시스템에서 중요한 부분입니다. C 언어에서 파일을 수정하는 것은 파일을 다시 읽고, 원하는 데이터를 찾아 수정한 후, 변경된 데이터를 다시 파일에 저장하는 방식으로 이루어집니다.

파일에서 데이터 검색하기


파일에서 특정 데이터를 검색하는 방법은 여러 가지가 있지만, 일반적으로 파일을 한 줄씩 읽으면서 조건에 맞는 데이터를 찾습니다. 예를 들어, 특정 학생의 점수를 검색하려면 파일을 열고 각 줄을 읽으면서 이름이나 점수가 일치하는지 확인합니다.

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

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

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

    struct Student student;
    char searchName[] = "Alice"; // 검색할 이름
    int found = 0;

    while (fscanf(file, "%s %d", student.name, &student.score) != EOF) {
        if (strcmp(student.name, searchName) == 0) {
            printf("학생 이름: %s, 점수: %d\n", student.name, student.score);
            found = 1;
            break; // 검색 후 종료
        }
    }

    if (!found) {
        printf("학생을 찾을 수 없습니다.\n");
    }

    fclose(file); // 파일 닫기
    return 0;
}

위 코드에서는 fscanf()로 파일에서 한 줄씩 읽고, strcmp() 함수를 사용하여 특정 이름을 검색합니다. 찾으면 해당 학생의 정보를 출력하고, 찾지 못하면 “학생을 찾을 수 없습니다”라는 메시지를 출력합니다.

파일에서 데이터 수정하기


파일에서 데이터를 수정하려면 먼저 파일을 읽은 후, 수정할 데이터를 메모리 상에서 변경하고, 수정된 데이터를 다시 파일에 덮어써야 합니다. C 언어에서는 파일의 내용을 직접 수정하는 것이 불가능하므로, 일반적으로 파일을 두 번 읽고 쓰는 방식으로 해결합니다.

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

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

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

    struct Student student;
    char searchName[] = "Alice"; // 수정할 학생 이름
    int found = 0;

    // 파일에서 데이터를 읽고 수정할 데이터를 찾기
    while (fscanf(file, "%s %d", student.name, &student.score) != EOF) {
        if (strcmp(student.name, searchName) == 0) {
            printf("찾은 학생 이름: %s, 기존 점수: %d\n", student.name, student.score);
            student.score = 95; // 점수 수정
            found = 1;
            break;
        }
    }

    if (found) {
        // 파일의 첫 번째 위치로 돌아가서 수정된 데이터를 덮어쓰기
        fseek(file, -sizeof(student), SEEK_CUR);
        fprintf(file, "%s %d\n", student.name, student.score); // 수정된 점수 저장
        printf("수정된 학생 이름: %s, 수정된 점수: %d\n", student.name, student.score);
    } else {
        printf("학생을 찾을 수 없습니다.\n");
    }

    fclose(file); // 파일 닫기
    return 0;
}

이 코드는 파일을 “r+” 모드로 열어 읽기와 쓰기를 동시에 할 수 있도록 합니다. fseek() 함수를 사용하여 파일의 현재 위치를 변경하고, 수정된 데이터를 덮어씁니다. 이 방식은 작은 파일에서는 유효하지만, 큰 파일에서는 비효율적일 수 있습니다.

파일 수정 시 주의점

  • 파일 모드 선택: 파일을 수정할 때는 반드시 “r+” 모드로 열어야 합니다. 이 모드는 읽기와 쓰기를 모두 허용합니다.
  • 파일 덮어쓰기: 파일을 수정할 때는 파일의 기존 내용을 덮어쓰기 때문에, 수정된 데이터가 정확히 덮어쓸 수 있도록 fseek()를 사용하여 파일 포인터를 이동해야 합니다.
  • 백업 권장: 파일을 직접 수정하는 작업은 위험할 수 있으므로, 수정 전에 파일의 백업을 만드는 것이 좋습니다.

파일에서 데이터를 검색하고 수정하는 과정은 데이터베이스 시스템에서 기본적인 작업으로, 파일 입출력을 효율적으로 다루는 데 중요한 기술입니다.

데이터 삭제 방법


파일에서 데이터를 삭제하는 방법은 간단하지 않으며, C 언어에서는 직접적으로 파일에서 특정 데이터를 삭제할 수 있는 기능은 제공되지 않습니다. 대신, 파일을 수정하는 방식으로 삭제를 구현할 수 있습니다. 일반적으로 데이터를 삭제하려면, 파일을 읽고 삭제할 데이터를 제외한 나머지 데이터를 새로운 파일에 기록한 후, 기존 파일을 삭제하고 새로운 파일을 기존 파일 이름으로 변경하는 방법을 사용합니다.

파일에서 데이터 삭제하기


파일에서 특정 데이터를 삭제하려면, 다음과 같은 단계를 따릅니다:

  1. 원본 파일을 열고 데이터를 읽는다.
  2. 삭제할 데이터를 찾고, 그 데이터를 제외한 나머지 데이터를 새로운 파일에 기록한다.
  3. 기존 파일을 삭제하고, 새로 만든 파일을 원본 파일 이름으로 바꾼다.
#include <stdio.h>
#include <string.h>

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

int main() {
    FILE *file = fopen("students.txt", "r"); // 읽기 모드로 원본 파일 열기
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    FILE *tempFile = fopen("temp.txt", "w"); // 삭제된 데이터가 없는 새로운 파일 열기
    if (tempFile == NULL) {
        printf("임시 파일을 열 수 없습니다.\n");
        fclose(file);
        return 1;
    }

    struct Student student;
    char deleteName[] = "Alice"; // 삭제할 학생 이름
    int found = 0;

    // 파일에서 데이터 읽으면서 삭제할 데이터 제외하고 새로운 파일에 기록
    while (fscanf(file, "%s %d", student.name, &student.score) != EOF) {
        if (strcmp(student.name, deleteName) != 0) {
            fprintf(tempFile, "%s %d\n", student.name, student.score); // 삭제하지 않을 데이터 기록
        } else {
            found = 1;
        }
    }

    if (!found) {
        printf("삭제할 학생을 찾을 수 없습니다.\n");
    }

    fclose(file);  // 원본 파일 닫기
    fclose(tempFile); // 임시 파일 닫기

    // 기존 파일을 삭제하고 새로운 파일로 바꾸기
    remove("students.txt");
    rename("temp.txt", "students.txt");

    printf("학생 %s이(가) 삭제되었습니다.\n", deleteName);

    return 0;
}

위 코드에서는 fscanf()로 원본 파일에서 데이터를 읽으면서 삭제할 학생을 제외한 나머지 데이터를 새로운 임시 파일에 기록합니다. 그런 다음 remove() 함수를 사용해 원본 파일을 삭제하고, rename() 함수를 사용하여 임시 파일을 원본 파일 이름으로 바꿉니다.

파일 삭제 시 주의점

  • 데이터 손실 방지: 파일에서 데이터를 삭제하는 작업은 실수로 데이터를 잃을 위험이 있으므로, 삭제 전에 반드시 데이터를 백업하는 것이 좋습니다.
  • 파일 접근 권한: 파일을 삭제하거나 이름을 변경할 때, 시스템의 파일 접근 권한에 따라 오류가 발생할 수 있으므로, 권한을 확인해야 합니다.
  • 성공적인 삭제 여부 확인: remove()rename() 함수는 실패할 수 있기 때문에, 반환값을 확인하여 제대로 실행되었는지 점검하는 것이 중요합니다.

파일에서 데이터를 삭제하는 작업은 C 언어의 기본적인 파일 입출력 방법을 활용하여 구현할 수 있으며, 작은 규모의 데이터베이스 시스템에서는 이 방식이 유용하게 사용될 수 있습니다.

응용 예시: 간단한 학생 정보 관리 시스템


이번에는 파일을 활용하여 간단한 학생 정보 관리 시스템을 구현하는 예시를 살펴보겠습니다. 이 시스템은 학생의 이름과 점수를 저장하고, 데이터를 추가, 검색, 수정, 삭제할 수 있는 기능을 제공합니다. 시스템은 파일을 사용하여 데이터를 영구적으로 저장하며, 각 기능을 하나씩 구현하여 실제로 어떻게 동작하는지 살펴봅니다.

학생 정보 관리 시스템 개요


학생 정보 관리 시스템은 다음과 같은 기능을 제공합니다:

  • 학생 추가: 새 학생의 이름과 점수를 입력하여 파일에 저장합니다.
  • 학생 검색: 특정 학생의 정보를 검색하여 출력합니다.
  • 학생 수정: 학생의 점수를 수정합니다.
  • 학생 삭제: 특정 학생을 삭제합니다.

학생 정보 추가


학생 정보를 추가하는 기능은 새 학생의 이름과 점수를 입력받아 파일에 저장하는 작업을 합니다.

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

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

void addStudent(FILE *file) {
    struct Student student;
    printf("학생 이름: ");
    scanf("%s", student.name);
    printf("학생 점수: ");
    scanf("%d", &student.score);

    fprintf(file, "%s %d\n", student.name, student.score); // 파일에 추가
    printf("학생 정보가 추가되었습니다.\n");
}

학생 정보 검색


학생 이름을 입력받고, 해당 학생의 정보를 파일에서 검색하여 출력합니다.

void searchStudent(FILE *file) {
    struct Student student;
    char searchName[50];
    printf("검색할 학생 이름: ");
    scanf("%s", searchName);

    int found = 0;
    while (fscanf(file, "%s %d", student.name, &student.score) != EOF) {
        if (strcmp(student.name, searchName) == 0) {
            printf("학생 이름: %s, 점수: %d\n", student.name, student.score);
            found = 1;
            break;
        }
    }

    if (!found) {
        printf("학생을 찾을 수 없습니다.\n");
    }
}

학생 정보 수정


학생의 점수를 수정하려면, 파일을 읽은 후 수정할 학생을 찾고, 해당 점수를 수정한 뒤 다시 파일에 덮어씁니다.

void modifyStudent(FILE *file) {
    struct Student student;
    char modifyName[50];
    printf("수정할 학생 이름: ");
    scanf("%s", modifyName);

    FILE *tempFile = fopen("temp.txt", "w"); // 임시 파일로 수정
    if (tempFile == NULL) {
        printf("임시 파일을 열 수 없습니다.\n");
        return;
    }

    int found = 0;
    while (fscanf(file, "%s %d", student.name, &student.score) != EOF) {
        if (strcmp(student.name, modifyName) == 0) {
            printf("현재 점수: %d\n", student.score);
            printf("새로운 점수: ");
            scanf("%d", &student.score);
            found = 1;
        }
        fprintf(tempFile, "%s %d\n", student.name, student.score); // 수정된 내용 기록
    }

    if (!found) {
        printf("학생을 찾을 수 없습니다.\n");
    }

    fclose(file);
    fclose(tempFile);
    remove("students.txt");
    rename("temp.txt", "students.txt"); // 기존 파일을 삭제하고 임시 파일로 대체
    printf("학생 정보가 수정되었습니다.\n");
}

학생 정보 삭제


학생을 삭제하는 방법은 파일을 읽은 후, 삭제할 학생을 제외한 나머지 데이터를 임시 파일에 기록하고, 그 후 기존 파일을 삭제하는 방식입니다.

void deleteStudent(FILE *file) {
    struct Student student;
    char deleteName[50];
    printf("삭제할 학생 이름: ");
    scanf("%s", deleteName);

    FILE *tempFile = fopen("temp.txt", "w"); // 임시 파일로 삭제
    if (tempFile == NULL) {
        printf("임시 파일을 열 수 없습니다.\n");
        return;
    }

    int found = 0;
    while (fscanf(file, "%s %d", student.name, &student.score) != EOF) {
        if (strcmp(student.name, deleteName) != 0) {
            fprintf(tempFile, "%s %d\n", student.name, student.score); // 삭제하지 않음
        } else {
            found = 1;
        }
    }

    if (!found) {
        printf("학생을 찾을 수 없습니다.\n");
    }

    fclose(file);
    fclose(tempFile);
    remove("students.txt");
    rename("temp.txt", "students.txt"); // 기존 파일 삭제 후 임시 파일로 교체
    printf("학생 정보가 삭제되었습니다.\n");
}

전체 시스템 실행


전체 시스템은 main() 함수에서 메뉴를 제공하고, 각 기능을 선택하여 실행할 수 있도록 합니다.

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

    int choice;
    do {
        printf("\n1. 학생 추가\n");
        printf("2. 학생 검색\n");
        printf("3. 학생 수정\n");
        printf("4. 학생 삭제\n");
        printf("5. 종료\n");
        printf("선택: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                addStudent(file);
                break;
            case 2:
                searchStudent(file);
                break;
            case 3:
                modifyStudent(file);
                break;
            case 4:
                deleteStudent(file);
                break;
            case 5:
                printf("프로그램을 종료합니다.\n");
                break;
            default:
                printf("잘못된 선택입니다.\n");
        }
    } while (choice != 5);

    fclose(file); // 파일 닫기
    return 0;
}

시스템 설명


이 시스템은 파일을 이용하여 학생의 정보를 추가하고, 검색, 수정 및 삭제할 수 있는 간단한 관리 시스템입니다. 각 기능은 파일 입출력을 통해 데이터를 처리하며, 학생의 이름과 점수 정보를 관리합니다. 이 시스템을 통해 파일을 활용한 데이터베이스 관리 방법을 이해할 수 있습니다.

요약


본 기사에서는 C 언어를 사용하여 파일을 기반으로 간단한 데이터베이스를 구현하는 방법을 다뤘습니다. 파일을 열고 데이터를 저장, 읽기, 수정 및 삭제하는 방법을 설명하며, 이를 통해 실제 데이터베이스 시스템처럼 데이터를 관리하는 기본적인 기법을 익혔습니다. 또한, 학생 정보 관리 시스템을 예시로, C 언어로 파일을 활용한 데이터베이스 구현을 실제로 구현해 보았습니다. 이와 같은 기법은 작은 프로젝트에서 유용하게 활용될 수 있습니다.

목차