Member 13551842 Ответов: 1

Как мне избежать пропуска функции getline() в этой функции?


Поэтому я пытаюсь создать сортировочную программу, которая сможет сортировать песни на основе различной информации, которую она дает. Это просто практика для занятий, довольно простые вещи. Я просто немного запутался в том, почему в цикле for в основной функции getline() в моем вызове readAlbum() пропускается при выполнении второго цикла. Couts в цикле просто существуют для меня, чтобы убедиться, что значения берутся и хранятся там, где я хочу.

#include <iostream>
#include <string>

using namespace std;

class Song
{
public:
	Song();
	void readArtist();
	void readAlbum();
	void readName();
	void readLength();
	void readYear();
	void setArtist(string Artist);
	void setAlbum(string Album);
	void setName(string Name);
	void setLength(string Length1, string Length2);
	void setYear(int Year);
	string getArtist();
	string getAlbum();
	string getName();
	string getLength();
	int getYear();
	~Song();

private:
	string artist, album, name, length;
	float year;
};

Song::Song()
{
	length = ":";
	year = 0;
	artist = "";
	name = "";
	album = "";
}

void Song::readArtist()
{
	string Artist;
	cout << "Enter artist name: ";
	getline(cin, Artist);
	setArtist(Artist);
}

void Song::setArtist(string Artist)
{
	artist = Artist;
}

void Song::readAlbum()
{
	string Album;
	cout << "Enter album name: ";
	getline(cin, Album);
	setAlbum(Album);
}

void Song::setAlbum(string Album)
{
	album = Album;
}

void Song::readName()
{
	string Name;
	cout << "Enter song name: ";
	getline(cin, Name);
	setName(Name);
}

void Song::setName(string Name)
{
	name = Name;
}

void Song::readLength()
{
	string LengthMin, LengthSec;
	cout << "Enter song length (minutes then seconds, separated by a space): ";
	cin >> LengthMin >> LengthSec;
	setLength(LengthMin, LengthSec);
}

void Song::setLength(string Length1, string Length2)
{
	length.insert(0, Length1);
	length.append(Length2);
}

void Song::readYear()
{
	int Year;
	cout << "Enter the year the song was released: ";
	cin >> Year;
	setYear(Year);
}

void Song::setYear(int Year)
{
	year = Year;
}

string Song::getArtist()
{
	return artist;
}

string Song::getAlbum()
{
	return album;
}

string Song::getName()
{
	return name;
}

string Song::getLength()
{
	return length;
}

int Song::getYear()
{
	return year;
}

Song::~Song()
{

}

int main()
{
	Song songs[20];
	bool done = false;

	for (int i = 0; (i < 20) || (!done); i++)
	{
		cout << "-Song " << i + 1 << "-" << endl;
		songs[i].readAlbum();
		cout << "Album: " << songs[i].getAlbum() << endl;
		songs[i].readArtist();
		cout << "Artist: " << songs[i].getArtist() << endl;
		songs[i].readName();
		cout << "Name: " << songs[i].getName() << endl;
		songs[i].readLength();
		cout << "Length: " << songs[i].getLength() << endl;
		songs[i].readYear();
		cout << "Year: " << songs[i].getYear() << endl;
	}

	return 0;
}


Что я уже пробовал:

не совсем уверен, что попробовать, братан

1 Ответов

Рейтинг:
0

Richard MacCutchan

Вы смешиваете вызовы с cin и getline что и создает проблему. Звонки в cin будет читать только до тех пор, пока не заполнит все пункты в списке. Это может оставить пробелы и/или концы строк во входном буфере. Так что если вы тогда позвоните getline вы будете читать эти остаточные данные, а не информацию, которую вы вводите в следующий раз.