Typiquement, vous faites cela par une surcharge operator>>
pour le type d'objet:
struct song_data {
std::string number;
std::string title;
std::string release_date;
// ...
};
std::istream &operator>>(std::istream &is, song_data &s_d) {
std::getline(is, s_d.number, '|');
std::getline(is, s_d.title, '|');
std::getline(is, s_d.release_date, '|');
std::string ignore;
std::getline(is, ignore, '|');
// ...
return is;
}
Selon que il y a plus de champs que vous voudrez peut-être ignorer (en particulier les champs de fuite), il peut parfois être plus pratique lire la ligne entière dans une chaîne, puis mettez cela dans un istringstream, et analyser les champs individuels à partir de là. En particulier, cela permet d'éviter les travaux supplémentaires en lisant plus de champs qui ne vous intéressent pas, au lieu de passer à la ligne suivante lorsque vous avez analysé les champs qui vous intéressent. Edit: Je traiterais probablement les genres en ajoutant un std::vector<bool> genres;
, et en lisant les 0 et les 1 dans ce vecteur. Je puis ajouter une énumération spécifiant quel genre est désigné par une position particulière dans le vecteur, donc (par exemple) tester si une chanson est classée comme « pays » ressemblerait à quelque chose comme:
enum { jazz, country, hiphop, classic_rock, progressive_rock, metal /*, ... */};
if (songs[i].genres[country])
if (songs[i].genres[hiphop])
process_hiphop(songs[i]);
Bien sûr , les genres exacts et leur ordre sont quelque chose que je ne connais pas, donc j'ai juste inventé quelques possibilités - vous devrez (évidemment) utiliser les genres (et l'ordre) définis pour le format de fichier.
En ce qui concerne traiter des centaines de chansons, la manière habituelle serait (comme implicite ci-dessus) de créer quelque chose comme: std::vector<song_data> songs;
. En utilisant une extraction de flux comme ci-dessus, vous pouvez copier les données du fichier au vecteur:
std::copy(std::istream_iterator<song_data>(infile),
std::istream_iterator<song_data>(),
std::back_inserter(songs));
Si vous êtes susceptible de rechercher principalement des chansons par nom (pour un exemple), vous pouvez préférer utiliser std::map<std::string, song_data> songs
.Il sera facile de faire quelque chose comme:
songs["new song"].release_date = Today;
comment puis-je savoir que le 1 et le titre de la chanson sont séparés les uns des autres par exemple? – Edward
@Edward - voir EDIT sur la façon d'analyser chaque ligne d'entrée en jetons, chacun étant 'std :: string'. Vous pouvez modifier ceci pour mettre les jetons directement dans le numéro de morceau «int» et votre «vecteur» de genres si votre entrée est connue pour être bien formée. –