2012-12-11 2 views
0

J'ai cette fonction IStream à lire dans un fichier txt de données dans le format de:C++ iStream, If-Else & Vectors

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

Ma fonction fonctionne presque parfaitement.

Voici mes problèmes que je n'arrive pas à comprendre. 1) Il imprime (sorties) au fur et à mesure que chaque piste est ajoutée à un album (ainsi, x copies du premier album, chacune avec la piste suivante attachée.) 2) Lorsqu'un nouvel album est créé, il conserve les anciennes pistes du album précédent et continue à les ajouter un par un. (donc le dernier album a toutes les pistes de tous les albums)

Je veux évidemment que chaque album soit seulement imprimé une fois, et que chaque album ait seulement ses propres chansons ... Toute aide serait appréciée. Merci.

+0

Il serait peut-être préférable de poser cette question à la [CodeReview] (http://codereview.stackexchange.com) site soeur. –

Répondre

1

Je vois un certain nombre de problèmes avec votre code.

stringstream stringstreamFirst(line);

Vous n'utilisez pas la variable stringstreamFirst et line est vide à ce moment.

Album anAlbum(artistName,albumTitle,trackVector);

Il y a un certain nombre de problèmes avec cette ligne.

  • Il utilise les valeurs incorrectes.
    Une première ligne, artistName, albumTitle, et TrackVector sont vides. Quand vous trouvez enfin un nouvel album, les artistName, albumTitle, et TrackVector sont ceux de l'album précédent, pas celui en cours. Les valeurs sont correctes au moment où vous arrivez aux plages d'un album, mais ce n'est pas le cas lorsque vous souhaitez créer un nouvel objet album.
  • C'est au mauvais endroit.
    Une fois placée, cette instruction crée un objet Album pour chaque ligne du fichier d'entrée. Le bon endroit pour créer un nouvel objet album est lorsque vous avez rencontré une nouvelle entrée d'album dans le fichier d'entrée.

stringstream stringstreamNew(line);
stringstream stringstreamNewNew(line);

Pourquoi les noms alambiqués, et pourquoi avez-vous besoin de deux variables? Une alternative serait d'utiliser un seul stringstream, créé comme première ligne de votre boucle while.

if ((ligne [8] ==! - '))
else if (ligne [8] == '-')

Ne pas reproduire vos conditions booléennes comme ce. Si vous voulez dire else (ce que vous voulez dire), utilisez else. La ligne est soit une entrée d'album ou une entrée de piste; il n'y a rien d'autre.

else // Ces lignes manquent

Vous n'avez pas le traitement des erreurs. Que faire si vous ne pouvez pas analyser ce qui devrait vraisemblablement être une entrée d'album, ou ce qui devrait probablement être une entrée de piste?

Ce que vous devez faire (pseudocode):

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 
0

Est-ce que Album peut-être stocker des références (ou même des pointeurs) à ses arguments constructeur? Ne faites pas cela, cela signifie qu'il n'y a qu'un seul vecteur de pistes - celui appelé trackVector - partagé entre les albums, qui ne cesse d'être ajouté à.

vous devez soit avoir un membre addTrack dans Albumou pas construire un Album jusqu'à ce que vous avez lu toutes les pistes selon qu'il est logique pour un Album d'être mutable.

En outre, vous ne modifiez jamais aC - et qu'attendez-vous de artistName = artistName?