C++ de la lecture d'un fichier dans une struct
À l'aide de fstreams j'ai un fichier ouvert qui contient de nombreuses lignes. Chaque contiguos ensemble de 4 lignes sont telles que: la première ligne est un int, le deuxième et le troisième sont des chaînes de caractères et le quatrième est un double. Cette séquence se poursuit jusqu'à l'EOF.
Je suis une tentative de chargement de ces lignes dans un struct tableau:
struct Library {
int id;
string title;
string artist;
double price;
};
et le code que j'essaie de mettre en œuvre pour charger les données dans la structure est ceci:
const int LIMIT = 10
Library database[LIMIT];
ifstream file;
file.open("list.txt");
if(file) {
while(!(file.eof()) && counter < LIMIT) {
file >> database[counter].id;
getline(file, database[counter].title;
getline(file, database[counter].artist;
file >> database[counter].price;
}
} else {
...
}
//Using the following to debug output
for(int i = 0; i < counter; i++) {
cout << "ID: " << database[i].id << endl
<< "Title: " << database[i].title << endl
<< "Artist: " << database[i].artist << endl
<< "Price: " << database[i].price << endl
<< "-----------------------" << endl;
}
Le fichier que je suis en train de jeter cette chose est
1234
Never Gonna Give You Up
Rick Astley
4.5
42
Thriller
Michael Jackson
32.1
Le problème, je vais avoir ici, c'est que entre la lecture de la id
et title
à l'aide de file >> ...
et getline(...)
c'est que quelque part un retour à la ligne morsure est introduite vissage jusqu'à la sortie, qui affiche cette monstruosité...
ID: 1234
Title:
Artist: Never Gonna Give You Up
Price: 0
--------------------
ID: 0
Title:
Artist:
Price: 0
--------------------
La solution est probablement la plus simple des solutions, mais surtout parce que je ne peux pas savoir exactement ce qui se passe avec la nouvelle ligne de morsure je ne peux pas combobulate une phrase à s'engouffrer dans google et faire mes trucs, et j'en suis au stade où j'ai été à la recherche à un problème si longtemps, les connaissances de base ne fonctionne pas correctement, par exemple pour gérer les flux d'entrée.
Toute forme d'aide serait grandement appréciée! Merci d'avance 🙂
Vous devez vous connecter pour publier un commentaire.
Cela se produit parce que le >> opérateur pour le flux d'entrée ne récupère que la partie de la ligne, et ne permet pas toujours de saisir le caractère de saut de ligne à la fin de la ligne. Lorsqu'il est suivi par un appel à
getline
, legetline
saisira le reste de la ligne précédemment analysée, pas la ligne d'après. Il ya quelques façons de résoudre ce problème: vous pouvez effacer la mémoire tampon du flux d'entrée après chaque lecture, ou vous pouvez simplement obtenir tous de votre entrée degetline
et juste analyser la résultante des chaînes de caractères en un entier ou un double lorsque vous avez besoin de avec des appels àstoi
oustod
.Comme une note de côté, vous ne voulez pas de détecter la fin de votre fichier de la façon dont vous actuellement. Voir pourquoi est-eof considéré comme mauvais à l'intérieur d'une condition de boucle?
getline
? Simplement parce que, pour diverses raisons, j'ai besoin d'éviterstoi
etstod
et de travailler uniquement sur la base de la saisie des stratégies.ignore
avec un argument d'un retour à la ligne devrait fonctionner pour extraire tous les caractères avant le retour à la ligne. (et le retour à la ligne elle-même)eof
condition de boucle est une erreur commune pour les débutants.Vous pouvez résoudre ce problème en ajoutant:
à chaque fois avant d'utiliser
getline(file, ...)
. En gros, cela va effacer la mémoire tampon d'entrée avant d'utiliser legetline()
fonction. Etfflush()
est déclarée dans le cstdio bibliothèque.fflush
? Le wiki stipule que le comportement defflush
pour les flux d'entrée est undefined.fflush
est censé être indéfini. L'idée était d'effacer la mémoire tampon d'entrée avant d'utilisergetline
pour obtenir les informations attendues. Je ne suis pas sûr de savoir comment le faire sans l'aide defflush
.ignore
fonctionne.ignore
vaut un aller, bien que parfois vous ne pouvez pas déterminer exactement combien de fois vous avez besoin de l'utiliserva lire, dans ce cas, un espace séparé de la séquence de caractères qui est interprété comme un int. Le retour à la ligne est considéré comme un espace. Vous devriez maintenant être assis sur ce caractère de saut de ligne, donc le getline() va lire rien -- avec succès-et incrémenter la position dans le fichier, juste après que.
Vous feriez mieux d'utiliser getline() pour chaque ligne, puis séparément interpréter les lignes de la lecture. Par exemple, la première ligne de lecture peut être interprété à une ultérieure std::stoi() pour obtenir la représentation entière de la chaîne.