[자료구조 - C언어] 자료구조 제14강: Music Library Program(3)
2022. 10. 27. 23:46ㆍCS/자료구조
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
'CS > 자료구조' 카테고리의 다른 글
[자료구조 - C언어] 자료구조 제14강: Music Library Program(5) (0) | 2022.10.29 |
---|---|
[자료구조 - C언어] 자료구조 제14강: Music Library Program(4) (0) | 2022.10.28 |
[자료구조 - C언어] 자료구조 제14강: Music Library Program(1), (2) (0) | 2022.10.27 |
[자료구조 - C언어] 자료구조 제13강: 이중 연결 리스트 (0) | 2022.10.26 |
[자료구조 - C언어] 자료구조 제12강: 연결 리스트 - 다항식(3) (0) | 2022.10.25 |