У меня есть эта функция iStream для чтения в файл .txt данных в формате:
Pink Floyd: Dark Side of the Moon
0:01:30 - Speak to Me
Моя функция почти работает идеально.
Вот мои проблемы, которые я просто не могу понять.
1) Он печатает (выводит) при добавлении каждой дорожки в альбом (поэтому печатает x
копии первого альбома, каждый с прикрепленным следующим треком.
2) Когда создается новый альбом, он сохраняет старые треки из предыдущего альбома и продолжает добавлять их один за другим. (итак, в финальном альбоме есть все треки из всех альбомов)
Очевидно, я хочу, чтобы каждый альбом печатался только один раз, и в каждом альбоме были только свои песни … Любая помощь будет принята с благодарностью. Благодарю.
Я вижу ряд проблем с вашим кодом.
stringstream stringstreamFirst(line);
Вы не используете переменную stringstreamFirst
а также line
пуст в этой точке.
Album anAlbum(artistName,albumTitle,trackVector);
Есть ряд проблем с этой линией.
artistName
, albumTitle
, а также TrackVector
пусты Когда вы наконец сталкиваетесь с новым альбомом, artistName
, albumTitle
, а также TrackVector
те для предыдущего альбома, а не текущий. Значения верны к тому времени, когда вы попадаете на дорожки в альбоме, но это не так, когда вы хотите создать новый объект альбома.Album
объект для каждой строки во входном файле. Правильное место для создания нового объекта альбома — это когда вы обнаружили новую запись альбома во входном файле.
stringstream stringstreamNew(line);
stringstream stringstreamNewNew(line);
Почему запутанные имена, и зачем вам две переменные? Альтернативой может быть использование только одного stringstream
, созданный как первая строка вашего while
петля.
если (! (строка [8] == ‘-‘))
иначе если (строка [8] == ‘-‘)
Не копируйте свои логические условия, как это. Если ты имеешь ввиду else
(что вы имеете в виду), просто используйте else
, Строка — это либо запись альбома, либо запись трека; больше ничего нет
else // Эти строки отсутствуют
У вас нет обработки ошибок. Что если вы не можете разобрать, что, по-видимому, должно быть записью в альбоме или что, по-видимому, должно быть записью в треке?
Что нужно сделать (псевдокод):
while (getline(istr, line)) {
stringstream linestream (line);
if (line looks like an album line) {
if (not the first line in the file) {
// Create an album using the artist name, album title, and track vector
// and add this album onto the vector of albums
}
// Parse the line for artist name and album title, preferably handling errors
// Clear the trackVector that now pertains to the previous album
}
else {
// Parse the line for track duration and name, preferably handling errors
// Add the track to the track vector.
}
}
// Create an album to cover the last album plus set of tracks
Есть ли Album
возможно хранить ссылки (или даже указатели) на аргументы своего конструктора?
Не делайте этого, это означает, что существует только один вектор дорожек — тот, который называется trackVector
— делится между альбомами, которые продолжают добавляться.
Вы должны иметь addTrack
член в Album
или же не построить Album
пока вы не прочитаете все треки в зависимости от того, имеет ли это смысл для Album
быть изменчивым
Кроме того, вы никогда не модифицируете aC
— и что вы ожидаете artistName = artistName
выполнить?