La version simple est d'utiliser un manipulateur similaire à std::ws
mais au lieu de sauter tous les espaces blancs, le paramètre std::ios_base::failbit
lorsqu'une nouvelle ligne est rencontrée. Ce manipulateur serait alors utilisé pour, au lieu de sauter les espaces blancs, sauter implicitement les espaces blancs autres que les nouvelles lignes. Par exemple (le code n'est pas testé mais je pense que quelque chose comme ceci avec les bugs et les erreurs de compilation enlevés devrait fonctionner) :
std::istream& my_ws(std::istream& in) {
std::istream::sentry kerberos(in);
while (isspace(in.peek())) {
if (in.get() == '\n') {
in.setstate(std::ios_base::failbit);
}
}
return in;
}
// ...
char name[64];
int array[12];
while (in >> std::setw(sizeof(name)) >> name) { // see (*) below
int* it = std::begin(array), end = std::end(array);
while (it != end && in >> my_ws >> *it) {
++it;
}
if (it != end && in) { deal_with_the_array_being_full(); }
else {
do_something_with_the_data(std::begin(array), it);
if (!in.eof()) { in.clear(); }
}
}
Je pense personnellement que le devoir demandait de lire les valeurs dans le fichier char
puis de les convertir en utilisant atoi()
o strol()
. Je pense que ce serait une solution ennuyeuse à l'exercice.
(*) Jamais même pas dans un exemple de code, utilisez l'opérateur d'entrée formatée avec une balise char
tableau array
sans en fixant également la taille maximale autorisée ! La taille peut être définie en paramétrant l'attribut width()
en utilisant, par exemple, le manipulateur. std::setw(sizeof(array))
. Si le width()
es 0
lors de l'utilisation de l'opérateur de saisie formatée avec un char
un nombre arbitraire de caractères sans espace est lu. Cela peut facilement déborder le tableau et devenir un problème de sécurité ! Essentiellement, c'est la façon C++ d'épeler la fonction C gets()
(qui est maintenant retiré des bibliothèques standard C et C++).