2010-08-18 10 views
0

Voici mon code. Le but est d'entrer un vecteur de classe d'étudiant, contenir le nom et les catégories de devoirs.La chaîne d'entrée C++ contient le caractère ASCII 26 (Substitute). Comment s'en débarrasser?

istream& input(istream& is, student& s){ 
    is.clear(); 
    cout << "Enter student name: "; 
    getline(is,s.name); 
    grade(is,s.homework); 
    return is; 
} 

istream& grade(istream& is, vector<double>& homework){ 
    if(is){ 
     homework.clear(); 
     double x; 
     cout << "Enter grade of student - Ctrl-Z to stop: "; 
     while(is>>x) 
      homework.push_back(x); 
     is.clear(); 
    } 
    return is; 
} 

Le problème est que le nom du premier étudiant est ok, mais quand le programme a lu le prochain nom de l'étudiant (Entrée du clavier), il commence toujours par le caractère de remplacement (ASCII 26). Je suppose que le problème vient du flux d'entrée, lorsque j'ai utilisé CTRL-Z pour signaler la fin de l'entrée des notes de devoirs. Pouvez-vous suggérer une solution?

Répondre

1

L'utilisation de Ctrl-Z permet d'insérer le caractère SUB dans le flux. Extraction vers un double arrêt juste avant ce personnage. Vous pouvez donc l'éliminer en utilisant la méthode istream :: ignore(). Utilisez un nombre de 1 et définissez le paramètre delim sur 0x1A (la valeur de SUB).

is.ignore(1, 0x1A);

L'autre possibilité est de ne pas demander à l'utilisateur de taper Ctrl-Z, appuyez sur ENTRÉE.