C언어 초급 - 14장: 예제 프로젝트 및 실습 (14.3 메모장 프로그램)

2025. 2. 25. 15:28프로그래밍 언어/C

14.3 메모장 프로그램

동적 메모리 할당과 파일 입출력을 활용하여 메모장 기능을 구현합니다.

프로그램 주요 기능

  1. 메모 입력 후 파일에 저장
  2. 파일에 저장된 메모 불러오기
  3. 기존 메모에 내용 추가
  4. 메모 삭제 (파일 초기화)
  5. 동적 메모리 할당을 사용하여 메모 크기 제한 없음

1. 동적 메모리 할당을 활용한 메모 저장 기능

메모는 길이가 정해져 있지 않기 때문에, 동적 메모리 할당(malloc())을 사용하여 메모 크기를 유동적으로 조절합니다.

📌 메모 입력 후 파일에 저장하는 기능

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

#define FILE_NAME "memo.txt"

// 메모 입력 및 파일 저장
void saveMemo() {
    FILE *fp = fopen(FILE_NAME, "w");  // 새로 작성 모드("w")
    if (fp == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return;
    }

    char *memo;
    size_t size = 1024;  // 초기 크기 설정
    memo = (char *)malloc(size * sizeof(char));

    if (memo == NULL) {
        printf("메모리 할당 실패\n");
        fclose(fp);
        return;
    }

    printf("메모 입력 (종료: Ctrl + D 또는 빈 줄 입력 후 Enter):\n");

    size_t len = 0;
    while (fgets(memo + len, size - len, stdin) != NULL) {
        len += strlen(memo + len);
        if (len > size - 50) {  // 크기 확장 필요 시 증가
            size *= 2;
            memo = (char *)realloc(memo, size);
            if (memo == NULL) {
                printf("메모리 재할당 실패\n");
                fclose(fp);
                return;
            }
        }
    }

    fprintf(fp, "%s", memo);  // 파일에 저장
    free(memo);
    fclose(fp);
    printf("메모가 저장되었습니다.\n");
}

동적 메모리(malloc(), realloc())를 활용하여 입력한 메모 크기를 자동 확장
파일(memo.txt)에 저장하여 프로그램 종료 후에도 데이터 유지


2. 저장된 메모 불러오기 (파일에서 읽기)

파일(memo.txt)에 저장된 메모를 불러와 출력하는 기능을 추가합니다.

📌 파일에서 읽어 메모 출력

// 메모 불러오기
void loadMemo() {
    FILE *fp = fopen(FILE_NAME, "r");  // 읽기 모드("r")
    if (fp == NULL) {
        printf("저장된 메모가 없습니다.\n");
        return;
    }

    char ch;
    printf("\n===== 저장된 메모 =====\n");

    while ((ch = fgetc(fp)) != EOF) {  // 한 글자씩 읽어 출력
        putchar(ch);
    }

    fclose(fp);
}

파일 모드 "r"을 사용하여 memo.txt에서 데이터를 읽음
fgetc()를 이용해 한 글자씩 출력하여 메모 내용을 표시


3. 기존 메모에 내용 추가

기존 메모를 유지하면서 새로운 내용을 추가하는 기능을 구현합니다.

📌 파일 끝에 새로운 내용을 추가하는 기능

// 기존 메모에 추가
void appendMemo() {
    FILE *fp = fopen(FILE_NAME, "a");  // 추가 모드("a")
    if (fp == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return;
    }

    char *memo;
    size_t size = 1024;
    memo = (char *)malloc(size * sizeof(char));

    if (memo == NULL) {
        printf("메모리 할당 실패\n");
        fclose(fp);
        return;
    }

    printf("추가할 메모 입력 (종료: Ctrl + D 또는 빈 줄 입력 후 Enter):\n");

    size_t len = 0;
    while (fgets(memo + len, size - len, stdin) != NULL) {
        len += strlen(memo + len);
        if (len > size - 50) {
            size *= 2;
            memo = (char *)realloc(memo, size);
            if (memo == NULL) {
                printf("메모리 재할당 실패\n");
                fclose(fp);
                return;
            }
        }
    }

    fprintf(fp, "%s", memo);
    free(memo);
    fclose(fp);
    printf("메모가 추가되었습니다.\n");
}

파일 모드 "a"(append) 사용 → 기존 내용 유지 후 새로운 메모 추가
동적 메모리 할당을 활용하여 긴 메모도 입력 가능


4. 메모 삭제 (파일 초기화)

파일(memo.txt)의 내용을 초기화하는 기능을 추가합니다.

📌 파일 초기화 기능

// 메모 삭제 (파일 초기화)
void deleteMemo() {
    FILE *fp = fopen(FILE_NAME, "w");  // 빈 파일 생성 (기존 내용 삭제)
    if (fp == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return;
    }

    fclose(fp);
    printf("메모가 삭제되었습니다.\n");
}

파일 모드 "w"(write)로 열어 빈 파일을 생성하면 기존 데이터 삭제됨
메모를 삭제할 수 있는 간단한 기능 추가


5. 전체 기능을 포함한 메인 함수

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

#define FILE_NAME "memo.txt"

void saveMemo();
void loadMemo();
void appendMemo();
void deleteMemo();

int main() {
    int choice;

    while (1) {
        printf("\n===== 메모장 프로그램 =====\n");
        printf("1. 새 메모 작성\n");
        printf("2. 저장된 메모 보기\n");
        printf("3. 기존 메모에 추가\n");
        printf("4. 메모 삭제\n");
        printf("5. 종료\n");
        printf("메뉴 선택: ");
        scanf("%d", &choice);
        getchar();  // 입력 버퍼 비우기

        switch (choice) {
            case 1: saveMemo(); break;
            case 2: loadMemo(); break;
            case 3: appendMemo(); break;
            case 4: deleteMemo(); break;
            case 5: printf("프로그램을 종료합니다.\n"); return 0;
            default: printf("잘못된 입력입니다. 다시 선택하세요.\n");
        }
    }
}

메뉴를 반복 표시하여 사용자가 원하는 기능을 선택 가능
입력값을 기반으로 switch-case 문을 사용하여 적절한 기능 호출


6. 실행 예시

===== 메모장 프로그램 =====
1. 새 메모 작성
2. 저장된 메모 보기
3. 기존 메모에 추가
4. 메모 삭제
5. 종료
메뉴 선택: 1

메모 입력 (종료: Ctrl + D 또는 빈 줄 입력 후 Enter):
오늘의 할 일
- C 프로그래밍 공부
- 운동 가기
- 책 읽기
메모가 저장되었습니다.
메뉴 선택: 2

===== 저장된 메모 =====
오늘의 할 일
- C 프로그래밍 공부
- 운동 가기
- 책 읽기
메뉴 선택: 3

추가할 메모 입력 (종료: Ctrl + D 또는 빈 줄 입력 후 Enter):
- 새로운 목표 추가
메모가 추가되었습니다.
메뉴 선택: 4

메모가 삭제되었습니다.

7. 정리

기능  설명
메모 저장 사용자가 입력한 메모를 파일(memo.txt)에 저장
메모 불러오기 저장된 메모를 불러와 출력
메모 추가 기존 메모에 새로운 내용 추가
메모 삭제 파일 초기화를 통해 모든 메모 삭제

📌 파일 입출력을 활용하여 데이터를 영구적으로 저장
📌 동적 메모리 할당을 통해 메모 길이 제한 없이 입력 가능
📌 간단한 메뉴를 제공하여 메모 관리 가능