0

i'm working on the "removesong" function. i need to check the vectors that already have the data separated and stored in them, and i need to see if the entered song title and artist name exist. if they do, i need to replace that same vector location with an empty string. i can't seem to get this to work, i need to also right the new vectors back into the file. it isn't supposed to completely overwrite the file, just remove the specified data.

file:

Here it Goes Again
OK Go
Rock
Fade to Black
Metallica
Metal
Enter Sandman
Metallica
Metal
Walk
Pantera
Metal
Learn to Fly
Foo Fighters
Rock
I Wanna Be Sedated
The Ramones
Punk
Stairway to Heaven
Led Zeppelin
Rock
Words
Paul Van Dyk
Electronic
Punk
Ferry Corsten
Electronic
Let Go
Paul Van Dyk
Electronic

program:

#include <iostream> // For input and output to the monitor
#include <fstream> // For file input and output (given)
#include <string> // For text data
#include <vector> // library for using vectors


using namespace std; // To make is easier put this in global namespace

void addsong(vector<string>&, vector<string>&, vector<string>&);
// function: this adds songs to the library
// parameters: string title, string artist, string genre
// functionality: prompts the user for the parameters and checks to make sure
// the song isn't already in the library

void removesong(vector<string>& titles, vector<string>& artists, vector<string>& genres);
// function: this removes songs from the library and replaces them with whitespace
// parameters: title, artist, genre
// funtionality: prompts user for song and artist of song wishing to remove

void searchsong(vector<string>& titles, vector<string>& artists, vector<string>& genres);


int main() 
{
	vector<string> titles;
	vector<string> artists;
	vector<string> genres;
	
	ifstream in_stream;
	in_stream.open("music_library.txt");
	
	int i=1;
	if (in_stream.fail( )) 
	{
		cout << "Unable to open file.\n";

	} 
	
	else
	{
				
		string title, artist, genre;
		while(!in_stream.eof())
		{
			if((i%3==1)||i==1)
			{
				getline(in_stream, title);
				titles.push_back(title);
				i++;
			}
			if((i%3==2)||i==2)
			{
				getline(in_stream, artist);
				artists.push_back(artist);
				i++;
			}
			if((i%3==0)||i==3)
			{
				getline(in_stream, genre);
				genres.push_back(genre);
				i++;
			}
			
		}	
	}
	
	cout << "Titles size: " << titles.size() << endl;
	cout << "Artist size: " << artists.size() << endl;
	cout << "Genre size: " << genres.size() << endl;
	
	


	
	int choice;
	do
	{
		cout << "\n\n1. Add a new song\n";
		cout << "2. Remove an existing song\n";
		cout << "3. Search for a song\n";
		cout << "4. Quit program\n";
		cin >> choice;
		
		switch(choice)
		{
			case 1: //user wants to add a song			
				addsong(titles, artists, genres);
				break;
			
			case 2: //user wants to remove an existing song
				removesong(titles, artists, genres);
				break;
			
			case 3: //user wants to search for a song
				searchsong(titles, artists, genres);
				break;
			
			case 4: //user wants to quit program
				cout << "GOODBYE!\n";
				
				break;
			
			
		}	
		
	}while(choice !=4);
	
	cin.get();
	in_stream.close( );
	return 0;
}


void addsong(vector<string>& titles, vector<string>& artists, vector<string>& genres)
{
	ofstream in_stream;
	in_stream.open("music_library.txt", ios::app);
	
	string t_title, a_artist, g_genre;
	
	if(in_stream.fail( ))
	{
		cout << "File failed to open." << endl;
	}
		
		cout << "Enter the title name: " << endl;
		cin.ignore(100, '\n');
		getline(cin, t_title); 
		titles.push_back(t_title);
		cout << "Enter the artist name: " << endl;
		getline(cin, a_artist);
		artists.push_back(a_artist);
		cout << "Enter the genre: " << endl;
		getline(cin, g_genre);
		genres.push_back(g_genre);
	
	for(unsigned int i = 0; i < titles.size(); ++i)
	{
		if(t_title.compare(titles[i]) !=0&&(a_artist.compare(artists[i])!=0))
		//compare is a function that i found on http://www.cplusplus.com/
		{	
			
			cout << "Items have been added to library" << endl;
			
			titles.push_back(t_title);
			artists.push_back(a_artist);
			genres.push_back(g_genre);
			
			int length_t = t_title.length( );
			int length_a = a_artist.length( );
			int length_g = g_genre.length( );
			
			if(length_t==0||length_a==0||length_g==0)
			{
				if(length_t==0&&length_a > 0&&length_g > 0)
				{
					in_stream << endl << a_artist << endl << g_genre;
				}
				if(length_a==0&&length_t > 0&&length_g >0)
				{
					in_stream << endl << t_title << endl << g_genre;
				}
				if(length_g==0&&length_t > 0&&length_a >0)
				{
					in_stream << endl << t_title << endl << a_artist;
				}
			}

			if(length_g==0&&length_a==0)
			{
				cout << "No genre type or artist name added to library." << endl;
				in_stream << endl << t_title;
			}
			if(length_g==0&&length_t==0)
			{
				cout << "No genre type or song title were added to the library." << endl;
				in_stream << endl << a_artist;
			}
			if(length_a==0&&length_t==0)
			{
				cout << "No artist name or song title were added to the library." << endl;
				in_stream << endl << g_genre;
			}
			if(length_g > 0 && length_t > 0 && length_a > 0)
			{
				in_stream << endl << t_title << endl << a_artist << endl << g_genre;
			}
			return;

		}	
		else
				cout << "Item exist!" << endl;
				return;
	}

		
	in_stream.close( );
}
void removesong(vector<string>& titles, vector<string>& artists, vector<string>& genres)
{
	ifstream library;
	ofstream in_stream;
	
	library.open("music_library.txt");
	in_stream.open("music_library.txt");
	
	string t_title, a_artist, g_genre;	
	
	cout << "Please enter the song title which you wish to remove: " << endl;
	cin.ignore(100, '\n');
	getline(cin, t_title); 

	cout << "Please enter the corresponding artist name: " << endl;
	getline(cin, a_artist);

	for(unsigned int i=0; i < titles.size(); i++)
	{
		if(t_title.compare(titles[i])!=0&&(a_artist.compare(artists[i])!=0))
		{
			cout << "Data not found in library!" << endl;
		}
		else
			
			titles[i] = ' ';
			artists[i] = ' ';
			genres[i] = ' ';
			in_stream << endl << titles[i] << endl << artists[i] << genres[i];
			
			cout << "Song data has been removed." << endl;
			return;
	
	
	}
	library.close();
	in_stream.close();

}

void searchsong(vector<string>& titles, vector<string>& artists, vector<string>& genres)
{
	ifstream in_stream;
	ofstream library;
	in_stream.open("music_library.txt");
	library.open("library.txt");
	int choice;
	string t_title, a_artist, g_genre;
	
	do
	{
		cout << "1. Search by song title." << endl;
		cout << "2. Search by artist." << endl;
		cout << "3. Search by genre." << endl;
		cin >> choice;
		
		switch(choice)
		{
			case 1:
				cout << "Enter song title: " << endl;
				cin.ignore(100, '\n');
				getline(cin, t_title);
				for(unsigned int i = 0; i < titles.size(); i++)
				{
					if(t_title.compare(titles[i])==0)
					{
						cout << titles[i] << endl << artists[i] << endl << genres[i] << endl << endl;
					}
				}
			
				break;
				
			case 2: 
				cout << "Enter artist: " << endl;
				cin.ignore(100, '\n');
				getline(cin, a_artist);
				for(unsigned int i = 0; i < artists.size(); i++)
				{
					if(a_artist.compare(artists[i])==0)
					{
						cout << titles[i] << endl << artists[i] << endl << genres[i] << endl << endl;
					}
				}
				break;
				
			case 3:
				cout << "Enter genre: " << endl;
				cin.ignore(100, '\n');
				getline(cin, g_genre);
				for(unsigned int i = 0; i < genres.size(); i++)
				{
					if(g_genre.compare(genres[i])==0)
					{
						cout << titles[i] << endl << artists[i] << endl << genres[i] << endl << endl;
					}					
				}
			
				break;
		}
		
		
	}while(!in_stream.eof());
	
	in_stream.close();
	library.close();
}
2
Contributors
1
Reply
2
Views
9 Years
Discussion Span
Last Post by Lerner
0

There are two basic errors in the following snippet:

else
  titles[i] = ' ';
  artists[i] = ' ';

First, lines two and three are supposed to be done every time the else is invoked, but only if the else is invoked. With the code as it stands that won't happen however. In order for it to happen place lines two and three within {}s.

Second single quotes, ' ', represent the space char, which is a single char. titles is a string. Assigning one to the other can cause problems. I would suggest assigning "", which is the representation of an empty STL string, to titles instead of ' '.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.