[자료구조 - C언어] 자료구조 제14강: Music Library Program(3)

2022. 10. 27. 23:46CS/자료구조

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

0. 실행 예

  • Data file name? - 프로그램을 실행하면 어떤 데이터 파일을 load 할지 물어본다.
    • 입력 없이 Enter를 치면 데이터 파일로부터 데이터를 읽지 않고 프로그램을 실행
  • status - 저장된 모든 노래의 번호, 가수, 제목, 파일의 경로명을 출력
    • 노래의 번호는 입력 순서 대로 번호 할당
    • 출력 시 가수 이름 알파벳 순으로 출력
      • 동일한 가수 이름이면 노래 제목으로 알파벳 순으로 출력
  • add - 가수 이름, 제목, 파일명으로 추가
    • 파일명은 지정하지 않아도 된다.
  • search - 가수 이름과 노래 제목으로 검색
    • 제목 없이 가수 이름만 검색해도 된다.
  • play 4 - 4번 노래를 play
  • remove 6 - 6번 노래를 목록에서 삭제
  • save as my_collection.txt - 목록을 파일에 저장
  • exit - 종료
  • 파일 형식
    • 가수#노래제목#경로# 순서
    • #문자를 필드 간의 구분자
    • 존재하지 않는 항목의 경우 하나의 공백 문자로 표시
      • 모든 라인은 반드시 구분자로 끝난다
  • 가수#노래제목#경로# LESSERAFIM#Sour Grapes# #

 

1. 프로젝트 구조

2. 소스파일 구성

  • 서로 연관된 함수들과 변수들을 하나의 파일에 넣는다: 모듈화
    • main.c - 사용자와의 상호작용과 main함수
    • library.c - 프로그램의 중요한 기능
    • string_tools.c - string 처리 관련, 도구적 성격

 

3. main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "string_tools.h"
#include "library.h"

#define BUFFER_LENGTH 200

void process_command();
void handle_add();

int main(){
    process_command();
}

void process_command(){
    
    char command_line[BUFFER_LENGTH];    //한 라인의 데이터를 읽어올 데이터 배열
    char *command;
    while(1){       //무한 루프
        printf("$ ");    //prompt 출력
        
        //사용자의 입력을 라인단위로 받음 - 실제로 읽은 길이를 리턴
        //stdin - 표준 입력 파일로 부터
        //리턴값이 0이하라면 사용자가 입력을 하지 않고 Enter
        if(read_line(stdin, command_line, BUFFER_LENGTH) <=0)
            continue;;
        
        command = strtok(command_line, " ");
        if(strcmp(command, "add")==0)
            handle_add();
//        else if(strcmp(command, "search")==0)
//            handle_search();
//        else if(strcmp(command, "remove")==0)
//            handle_remove();
//        else if(strcmp(command, "status")==0)
//            handle_status();
//        else if(strcmp(command, "play")==0)
//            handle_play();
//        else if(strcmp(command, "save")==0)
//            handle_save();
        else if(strcmp(command, "exit")==0)
            break;
    }
}

void handle_add(){
    
    char buffer[BUFFER_LENGTH];
    char *artist = NULL, *title = NULL, *path = NULL;
    
    printf("    Artist: ");
    if(read_line(stdin, buffer, BUFFER_LENGTH)>0)
        artist = strdup(buffer);        //buffer에 저장한 값을 복사해서 대입
    
    printf("    Title: ");
    if(read_line(stdin, buffer, BUFFER_LENGTH)>0)
        title = strdup(buffer);
    
    printf("    Path: ");
    if(read_line(stdin, buffer, BUFFER_LENGTH)>0)
        path = strdup(buffer);
    
    
    //테스트 삼아 컴파일 에러 점검
    printf("%s  %s  %s\\n", artist, title, path);
    
    //add to the music library
    add_song(artist, title, path);
}

 

4. string_tools.c

#include "string_tools.h"    //소스파일은 자신의 헤더파일을 include 

//매개변수: 파일 포인터, 읽어올 char 배열, 배열의 크기
int read_line(FILE *fp, char str[], int n){
    int ch, i = 0;
    //파일 포인터가 가리키고 있는 파일로 부터 한 char을 읽어서 ch에 저장
    //한 라인의 끝에 도달하거나 파일의 끝에 도달할 때 까지
    while((ch=fgetc(fp)) != '\\n' && ch != EOF)
        if(i<n-1)
            str[i++] = ch;
    str[i] = '\\0';
    //실제로 읽은 글자수 리턴
    return i;
}

4-1. string_tools.h

//#pragma once    //헤더 파일이 중복 include 되는 것을 방지
#ifndef STRING_TOOLS_H    //중복 include 방지 정석적 방법
#define STRING_TOOLS_H

#include <stdio.h>

int read_line(FILE *fp, char str[], int n);

#endif /* STRING_TOOLS_H */

 

5. library.c

#include "library.h"

void add_song(char *artist, char *title, char *path){
    
}

5-1. library.h

#ifndef LIBRARY_H
#define LIBRARY_H

#include <stdio.h>

void add_song(char *artist, char *title, char *path);

#endif /* LIBRARY_H */

 

6. 실행 결과

 

 

 

 


부경대학교 권오흠 교수님의 [c로 배우는 자료구조 및 여러 가지 예제 실습] 강의 정리입니다. 감사합니다.

https://www.youtube.com/watch?v=Co3btJdnjRg&t=2285s 

 

728x90