Note: veuillez lire les commentaires avant de répondre. Le problème semble être spécifique au compilateur.Pourquoi iostream coupe-t-il la première lettre dans certains mots?
J'ai un programme simple qui lit un nom et quelques notes d'un fichier ou de la console dans une structure Student_info, puis imprime certaines des données en surchargeant < < et >> opérateurs. Cependant, le programme coupe des parties ou même des mots entiers et déplace les données. Par exemple, l'entrée
Eunice 29 87 42 33 18 13
Mary 71 24 3 96 70 14
Carl 61 12 10 44 82 36
Debbie 25 42 53 63 34 95
retours
Eunice: 42 33 18 13
Mary: 3 96 70 14
rl: 10 44 82 36
25: 63 34 95
suggérant que d'une certaine manière, le flux a ignoré les deux premières lettres de Carl, puis déplacé l'ensemble du flux gauche 1 mot. J'ai essayé de déboguer cela pendant une bonne partie de l'heure, mais cela semble arbitraire. Pour différents noms, différents mots sont coupés, sans motif apparent.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
struct Student_info {
friend std::ostream &operator<<(std::ostream &output,
const Student_info &S) { // overloads operator to print name and grades
output << S.name << ": ";
for (auto it = S.homework.begin(); it != S.homework.end(); ++it)
std::cout << *it << ' ';
return output;
}
friend std::istream &operator>>(std::istream &input, Student_info &S) { // overloads operator to read into Student_info object
input >> S.name >> S.midterm >> S.final;
double x;
if (input) {
S.homework.clear();
while (input >> x) {
S.homework.push_back(x);
}
input.clear();
}
return input;
}
std::string name; // student name
double midterm, final; // student exam scores
std::vector<double> homework; // student homework total score (mean or median)
};
int main() {
//std::ifstream myfile ("/Users/.../Documents/C++/example_short.txt");
Student_info student; // temp object for receiving data from istream
std::vector<Student_info> student_list; // list of students and their test grades
while (std::cin >> student) { // or myfile >> student
student_list.push_back(student);
student.homework.clear();
}
for (auto it = student_list.begin(); it != student_list.end(); ++it) {
std::cout << *it << '\n';
}
return 0;
}
modifier: nouveau caractère ajouté.
Comme vous pouvez le voir ne fonctionne pas avec clang, mais il le fait avec GCC
Lire la ligne entière dans une chaîne avec 'getline()', puis utiliser un 'std :: stringstream' pour le lire dans les membres de la structure. – Barmar
Il fonctionne plutôt bien sur mon ordinateur. – Jiahao
@ArnoldLayne Odd. Je compile en XCode 8.3.3, et [this] (http://imgur.com/a/bxNvU) est la sortie. – JAustin