Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <map>
- #include <set>
- #include <algorithm>
- #include <iterator>
- #include <conio.h>
- #include <stack>
- #include <stdlib.h>
- using namespace std;
- class Music_Player
- {
- private:
- struct track
- {
- private:
- int YearConvertFromString(string a)
- {
- int res = 0;
- int crt = 0;
- if (a[0] == '+')
- crt++;
- for (int i = crt; i < a.size(); i++)
- if (isdigit(a[i]))
- res = (res * 10) + (a[i] - '0');
- else
- return -1;
- return res;
- };
- string convertToString(int i)
- {
- string res;
- res.clear();
- stack <char> digit;
- if (i < 0)
- {
- res = "-";
- i = -i;
- }
- else
- if (i == 0)
- {
- res = '0';
- return res;
- }
- i = abs(i);
- while (i > 0)
- {
- digit.push(i % 10 + 48);
- i = i / 10;
- }
- while (!digit.empty())
- {
- res += digit.top();
- digit.pop();
- }
- return res;
- }
- public:
- string track_name;
- int year_of_execution;
- string performer;
- track()
- {
- performer = "unknown";
- track_name = "unknown";
- year_of_execution = -1;
- };
- track(string default)
- {
- performer = "unknown";
- track_name = default;
- year_of_execution = -1;
- };
- track(int in_year_of_execution)
- {
- performer = "unknown";
- track_name = "unknown";
- year_of_execution = in_year_of_execution;
- };
- track(string default, int in_year_of_execution)
- {
- performer = "unknown";
- track_name = default;
- year_of_execution = in_year_of_execution;
- }
- track(string in_performer, string in_track_name)
- {
- performer = in_performer;
- track_name = in_track_name;
- year_of_execution = -1;
- };
- track(string in_performer, string in_track_name, int in_year_of_execution)
- {
- performer = in_performer;
- track_name = in_track_name;
- year_of_execution = in_year_of_execution;
- };
- void getTrackFromString(string strInTrackList)
- {
- string prsm;
- int i = 0;
- int end = strInTrackList.length();
- int gapFlag = 1;
- performer.clear();
- track_name.clear();
- while ((gapFlag == 1) && (i < end))
- {
- if ((strInTrackList[i] == ' ') && (strInTrackList[i + 1] == '-'))
- {
- gapFlag = 2;
- i += 3;
- break;
- }
- if ((strInTrackList[i] == ' ') && (strInTrackList[i + 1] == '['))
- {
- gapFlag = 3;;
- i += 2;
- break;
- }
- performer += strInTrackList[i];
- i++;
- }
- while ((gapFlag == 2) && (i < end))
- {
- if ((strInTrackList[i] == ' ') && (strInTrackList[i + 1] == '['))
- {
- gapFlag = 3;;
- i += 2;
- break;
- }
- track_name += strInTrackList[i];
- i++;
- }
- while ((gapFlag == 3) && (i < end))
- {
- if (strInTrackList[i] == ']')
- {
- if (prsm == "")
- year_of_execution = -1;
- else /*newTrack.year_of_execution = atoi(prsm); выдает ошибку,
- пришлось вставлять свой конвертер*/
- year_of_execution = YearConvertFromString(prsm);
- }
- prsm += strInTrackList[i];
- i++;
- }
- if (track_name == "")
- {
- track_name = performer;
- performer = "unknown";
- }
- //showTrack();
- }
- string trackInString()
- {
- string track;
- track += performer + " - " + track_name + " [";
- if (year_of_execution != -1)
- track += convertToString(year_of_execution) + "] ";
- else
- track += "unknown] ";
- return track;
- }
- void showTrack()
- {
- cout << trackInString() << '\n';
- }
- };
- multimap <string, track> track_list;
- set <string> performers_set;
- public:
- void get_track_list_in_multimap()
- {
- string strTrack;
- track test = track();
- ifstream in_track_list("track_list.txt");
- while (in_track_list.peek() != EOF)
- {
- getline(in_track_list, strTrack);
- test.getTrackFromString(strTrack);
- track_list.insert(pair <string, track>(test.performer, test));
- performers_set.insert(test.performer);
- }
- in_track_list.close();
- }
- void show_track_list(string name)
- {
- auto iterPair = track_list.equal_range(name);
- if (iterPair.first == iterPair.second)
- {
- cout << "No this musician";
- cout << '\n';
- }
- else
- {
- for (auto music_treck = iterPair.first; music_treck != iterPair.second; ++music_treck)
- {
- music_treck->second.showTrack();
- //cout << '\n';
- }
- }
- }
- void show_track_list()
- {
- for (auto iter = performers_set.begin(); iter != performers_set.end(); ++iter)
- {
- auto iterPair = track_list.equal_range(*iter);
- if (iterPair.first == iterPair.second)
- cout << "Not found";
- else
- {
- for (auto music_treck = iterPair.first; music_treck != iterPair.second; ++music_treck)
- {
- music_treck->second.showTrack();
- //cout << '\n';
- }
- }
- }
- }
- void show_performers_set()
- {
- for (auto iter = performers_set.begin(); iter != performers_set.end(); ++iter)
- {
- cout << *iter << '\n';
- }
- }
- void add_performer(track in)
- {
- track_list.insert(pair <string, track>(in.performer, in));
- performers_set.insert(in.performer);
- }
- void delete_musician(string name)
- {
- string strTrack;
- track test = track();
- ifstream in("track_list.txt");
- ofstream out("river_chest.txt");
- while (in.peek() != EOF)
- {
- getline(in, strTrack);
- test.getTrackFromString(strTrack);
- if (test.performer != name)
- out << strTrack << "\n";
- };
- in.close();
- out.close();
- ifstream in2("river_chest.txt");
- ofstream out2("track_list.txt");
- while (in2.peek() != EOF)
- {
- getline(in2, strTrack);
- out2 << strTrack << "\n";
- };
- in2.close();
- out2.close();
- out.open("river_chest.txt", ios_base::trunc);
- out.close();
- track_list.clear(); //multimap
- performers_set.clear(); //set
- get_track_list_in_multimap();
- }
- void rename_musician(string oldname, string newname)
- {
- string strTrack;
- track test = track();
- ifstream in("track_list.txt");
- ofstream out("river_chest.txt");
- while (in.peek() != EOF)
- {
- getline(in, strTrack);
- test.getTrackFromString(strTrack);
- if (test.performer != oldname)
- out << test.trackInString() << "\n";
- else
- {
- test.performer = newname;
- out << test.trackInString() << "\n";
- }
- };
- in.close();
- out.close();
- ifstream in2("river_chest.txt");
- ofstream out2("track_list.txt");
- while (in2.peek() != EOF)
- {
- getline(in2, strTrack);
- out2 << strTrack << "\n";
- };
- in2.close();
- out2.close();
- out.open("river_chest.txt", ios_base::trunc);
- out.close();
- track_list.clear(); //multimap
- performers_set.clear(); //set
- get_track_list_in_multimap();
- }
- void reset_list_from_multimap()
- {
- ofstream out("track_list.txt");
- for (auto iter = performers_set.begin(); iter != performers_set.end(); ++iter)
- {
- auto iterPair = track_list.equal_range(*iter);
- if (iterPair.first == iterPair.second)
- cout << "No track";
- else
- {
- for (auto music_treck = iterPair.first; music_treck != iterPair.second; ++music_treck)
- {
- out << music_treck->second.trackInString() << "\n";
- }
- }
- }
- }
- void console_getline(string &get)
- {
- string ts;
- cin >> get;
- getline(cin, ts);
- get += ts;
- }
- bool interface_player()
- {
- cout << "enter the number of the action:" << "\n";
- cout << "1. show artist list" << "\n";
- cout << "2. show track list" << "\n";
- cout << "3. show artist songs" << "\n";
- cout << "4. change the stage name of the musician" << "\n";
- cout << "5. remove the artist and his music" << "\n";
- cout << "6. add artist or track" << "\n";
- cout << "7. exit" << "\n";
- char key;
- cin >> key;
- switch (key)
- {
- case '1':
- {
- system("CLS");
- show_performers_set();
- cout << "\n";
- return 1;
- }
- case '2':
- {
- system("CLS");
- show_track_list();
- cout << "\n";
- return 1;
- }
- case '3':
- {
- system("CLS");
- string name;
- show_performers_set();
- cout << "\n";
- cout << "enter the name of the musician: ";
- console_getline(name);
- cout << "\n";
- show_track_list(name);
- cout << "\n";
- return 1;
- }
- case '4':
- {
- system("CLS");
- string oldname, newname;
- show_performers_set();
- cout << "\n";
- cout << "enter the old name of the musician: ";
- console_getline(oldname);
- cout << "\n";
- cout << "enter the new name of the musician: ";
- console_getline(newname);
- cout << "\n";
- rename_musician(oldname, newname);
- return 1;
- }
- case '5':
- {
- system("CLS");
- string name;
- show_performers_set();
- cout << "\n";
- cout << "enter the name of the musician: ";
- console_getline(name);
- cout << "\n";
- delete_musician(name);
- return 1;
- }
- case '6':
- {
- system("CLS");
- string addString;
- track addTrack;;
- cout << "enter the track name in this format:" << "\n";
- cout << "<<artist name>> - <<track name>> [<<year of creation>>]" << "\n";
- cout << "If there is no information about the artist or song title, please write \"unknown\"" << "\n";
- cout << "If you do not know the year, it is possible to write nothing or to put \"[]\"" << "\n";
- cout << "for example:" << "\n" <<"Edguy - King of Fools [2004]" << "\n";
- cout << "unknown - Get Lucky []" << "\n\n";
- console_getline(addString);
- addTrack.getTrackFromString(addString);
- add_performer(addTrack);
- return 1;
- }
- case '7':
- {
- return 0;
- }
- default: //пользователь ввёл несуществующие вариант
- system("CLS");
- cout << "Invalid input" << '\n';
- return 1;
- }
- }
- };
- int main()
- {
- Music_Player myPlayer;
- myPlayer.get_track_list_in_multimap();
- //myPlayer.show_performers_set();
- //system("pause");
- //system("CLS");
- //myPlayer.show_track_list();
- while (myPlayer.interface_player())
- {
- if (!myPlayer.interface_player())
- return 0;
- }
- //mciSendString("play D:\\Arch Enemy - Nemesis.mp3 wait", NULL, 0, NULL);
- //mciSendString("open \"D:\music2\my music\Arch Enemy - Nemesis.mp3\" type mpegvideo alias mp3", NULL, 0, NULL);
- //#include<stdlib.h>
- //...
- //
- //
- //_getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement