the program keeps track of a persons musical library. addsong checks to make sure that the data being entered is not already present in the file. if it is present, it is not added, if it isn't present, it is added at the end of the file.

the removesong function is what i'm having trouble with. i've asked for the desired song to remove and corresponding artist. the program is supposed to open the file, and see if the entered song and artist exist. if it does, the data should be deleted from the file and instead become blank strings in the corresponding vectors.

here is the code

#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


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
			
				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))
		{	
			
			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)
{
	ofstream in_stream;
	in_stream.open("music_library.txt", ios::app);
	
	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); 
	titles.push_back(t_title);
	cout << "Please enter the corresponding artist name: " << endl;
	getline(cin, a_artist);
	artists.push_back(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.push_back(" ");
			artists.push_back(" ");
			genres.push_back(" ");
			
			in_stream << endl<< "" << endl << "" << endl << "";
			
			cout << "Song data has been removed." << endl;
			return;
	
	
	}
	in_stream.close();

}

music_library.txt:

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

Recommended Answers

All 2 Replies

You are adding empty strings to the back of the file, not overwriting the desired values by assigning empty strings at the desired index within the vector. For what it's worth I'd suggest using the erase() method of the vector class to remove the entries completely.

that would make a lot more sense, but the assignment specified that we needed to replace the old strings with empty strings

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.