C ++ iStream, If-Else & amp; векторы

У меня есть эта функция iStream для чтения в файл .txt данных в формате:

  Pink Floyd: Dark Side of the Moon
0:01:30 - Speak to Me

Моя функция почти работает идеально.

Вот мои проблемы, которые я просто не могу понять.
1) Он печатает (выводит) при добавлении каждой дорожки в альбом (поэтому печатает x копии первого альбома, каждый с прикрепленным следующим треком.
2) Когда создается новый альбом, он сохраняет старые треки из предыдущего альбома и продолжает добавлять их один за другим. (итак, в финальном альбоме есть все треки из всех альбомов)

Очевидно, я хочу, чтобы каждый альбом печатался только один раз, и в каждом альбоме были только свои песни … Любая помощь будет принята с благодарностью. Благодарю.

0

Решение

Я вижу ряд проблем с вашим кодом.

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
1

Другие решения

Есть ли Album возможно хранить ссылки (или даже указатели) на аргументы своего конструктора?

Не делайте этого, это означает, что существует только один вектор дорожек — тот, который называется trackVector — делится между альбомами, которые продолжают добавляться.

Вы должны иметь addTrack член в Album или же не построить Album пока вы не прочитаете все треки в зависимости от того, имеет ли это смысл для Album быть изменчивым

Кроме того, вы никогда не модифицируете aC — и что вы ожидаете artistName = artistName выполнить?

0

По вопросам рекламы [email protected]