Skip to content

Instantly share code, notes, and snippets.

@SproutSeeds
Created July 3, 2020 05:53
Show Gist options
  • Save SproutSeeds/9cb53dbff6ee95ee81721be8aac8079c to your computer and use it in GitHub Desktop.
Save SproutSeeds/9cb53dbff6ee95ee81721be8aac8079c to your computer and use it in GitHub Desktop.
// Cody Mitchell
// cs162 30179
// This program will load all songs from songs.txt then show a menu selection that lets the user add, remove and search for songs by artist name.
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int STRING_SIZE = 256;
const int LINE_SIZE = 256;
const int DATABASE_SIZE = 256;
int addSong(struct Song songArray);
struct Song{
char title[STRING_SIZE];
char artist[STRING_SIZE];
char minutes[STRING_SIZE];
char seconds[STRING_SIZE];
char album[STRING_SIZE];
};
struct Song* load_database(int& arraySize){
struct Song * songArray = new struct Song[DATABASE_SIZE];
char title[STRING_SIZE];
char artist[STRING_SIZE];
char minutes[STRING_SIZE];
char seconds[STRING_SIZE];
char album[STRING_SIZE];
char line[STRING_SIZE];
char* s = ";";
ifstream file("songs.txt");
if(!file.is_open()){
return NULL;
}
int j = 0;
// Professor Notes
/*
istream cin; //input stream
ifstream file; //file input stream
*/
/*
while(!file.eof()){
file.get(songArray[j].title, STRING_SIZE, ';');
file.ignore(STRING_SIZE, ';');
file.get(songArray[j].artist, STRING_SIZE, ';');
file.ignore(STRING_SIZE, ';');
}
*/
while(file.getline(line, LINE_SIZE)){
char* token;
int i = 0;
token = strtok(line, s);
while( token != NULL )
{
if(i == 0){
strcpy(songArray[j].title, token);
}else if (i == 1){
strcpy(songArray[j].artist, token);
}else if (i == 2){
strcpy(songArray[j].minutes, token);
}else if (i == 3){
strcpy(songArray[j].seconds, token);
}else if (i == 4){
strcpy(songArray[j].album, token);
}
i++;
token = strtok(NULL, s);
}
j++;
arraySize++;
}
file.close();
return songArray;
}
int getMenuSelectionFromUser(){
int menuSelection ;
cout << endl;
cout << "|------------------------------------------------|" << endl;
cout << "Enter 1 to input a new song." << endl;
cout << "Enter 2 to display information from all songs." << endl;
cout << "Enter 3 to remove a song by index." << endl;
cout << "Enter 4 to search for songs by a specific artist" << endl;
cout << "Enter 5 to quit." << endl;
cout << "|------------------------------------------------|" << endl;
cout << endl;
cin >> menuSelection;
return menuSelection;
}
void addSong(struct Song * songArray, int& size){
char userConfirmation = 'n';
char inputData[STRING_SIZE];
cin.clear();
while(userConfirmation =='n'){
cin.clear();
cin.ignore();
cout << "What is the Song Title?" << endl;
cin.get(songArray[size].title, STRING_SIZE, '\n');
cin.clear();
cin.ignore();
cout << "What is the artist name?" << endl;
cin.get(songArray[size].artist, STRING_SIZE, '\n');
cin.clear();
cin.ignore();
cout << "How many minutes is the song?" << endl;
cin.get(songArray[size].minutes, STRING_SIZE, '\n');
cin.clear();
cin.ignore();
cout << "How many seconds is the song?" << endl;
cin.get(songArray[size].seconds, STRING_SIZE, '\n');
cin.clear();
cin.ignore();
cout << "What is the album title?" << endl;
cin.get(songArray[size].album, STRING_SIZE, '\n');
cout << "You Entered..." << endl;
cout << "Title: " << songArray[size].title << endl;
cout << "Artist: " << songArray[size].artist << endl;
cout << "Minutes: " << songArray[size].minutes << endl;
cout << "Seconds: " << songArray[size].seconds << endl;
cout << "Album: " << songArray[size].album << endl;
cout << "Is this correct? y or n" << endl;
cin >> userConfirmation;
}
// Append songs.txt
ofstream outfile;
outfile.open("songs.txt", ios_base::app);
outfile << songArray[size].title << ";" << songArray[size].artist << ";" << songArray[size].minutes << ";" << songArray[size].seconds << ";" << songArray[size].album << '\n';
outfile.close();
size++;
}
void displayAllSongs(struct Song * songArray, int size){
for(int i = 0; i < size; i++){
cout << "[" << i << "]" << endl;
cout << " " << "Title: " << songArray[i].title << endl;
cout << " " << "Artist: " << songArray[i].artist << endl;
cout << " " << "Minutes: " << songArray[i].minutes << endl;
cout << " " << "Seconds: " << songArray[i].seconds << endl;
cout << " " << "Album: " << songArray[i].album << endl;
}
}
void removeSong(struct Song * songArray, int& size){
int index;
cout << "What Song index would you like to remove?" << endl;
cin >> index;
if(index == 0){
copy(songArray + 1, songArray + size, songArray + 0);
}else{
copy(songArray + (index - 1), songArray + size, songArray + index);
}
size--;
ofstream outfile;
outfile.open("songs.txt");
// Writes over the entire songs.txt file
for(int i = 0; i < size; i++){
outfile << songArray[i].title << ";" << songArray[i].artist << ";" << songArray[i].minutes << ";" << songArray[i].seconds << ";" << songArray[i].album << '\n';
}
outfile.close();
}
void artistSearch(struct Song * songArray, int size){
char artist[STRING_SIZE];
memset(artist, 0, STRING_SIZE);
cin.clear();
cin.ignore();
cout << "What artist's songs are you searching for?" << endl;
cin.get(artist, STRING_SIZE, '\n');
for(int i = 0; i < size; i++){
if(strcmp(artist, songArray[i].artist) == 0){
cout << "[" << i << "]" << endl;
cout << " " << "Title: " << songArray[i].title << endl;
cout << " " << "Artist: " << songArray[i].artist << endl;
cout << " " << "Minutes: " << songArray[i].minutes << endl;
cout << " " << "Seconds: " << songArray[i].seconds << endl;
cout << " " << "Album: " << songArray[i].album << endl;
}
}
}
int main(){
struct Song* db;
int input = 0;
int size = 0;
db = load_database(size);
if(db == NULL){
cout << "db is NULL, file was not open." << endl;
}
while(input != 5){
input = getMenuSelectionFromUser();
if(input == 1){
addSong(db, size);
}else if(input == 2){
displayAllSongs(db, size);
}else if(input == 3){
removeSong(db, size);
}else if(input == 4){
artistSearch(db, size);
}
}
delete [] db;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment