У меня есть файл .txt с именами и оценками, такими как «emiltytaco 56». После фамилии есть 3 пустых строки, которые не должны быть вставлены в мой файл и кучу. Однако код прерывается и сбрасывается при попадании в пустые строки. Это функция вставки
while(myfile.good())
{
getline(myfile, line);
name = line.substr(0,line.find("\t"));
stringstream convert((line.substr(line.find("\t")+1)));
convert >> grade;
if(name.at(0) > 96 && name.at(0) < 123)
{
insert(name, grade);
cout << name << " " << grade << endl;
}
}
myfile.close();
должен ли .close быть частью оператора «else» с if? у моего друга есть именно эта вещь, но его нет.
Во-первых, измените ваш цикл на что-то вроде:
while (getline(myfile, line)) {
// ...
}
Во-вторых, вероятно, намного проще передать всю строку в поток строк и прочитать оттуда обе части:
stringstream convert(line);
std::getline(convert, name, '\t');
convert >> grade;
В-третьих, если вы хотите проверить наличие строчных букв, вам гораздо лучше islower
чем сравнение с магическими числами, такими как 96 и 123. Я бы не стал делать проверку таким образом. Если вы хотите проверить наличие пустой строки, лучше сделать это напрямую, line.empty()
сразу после прочтения. Используя это, вы получите что-то вроде:
while (getline(myfile, line))
if (!line.empty()) {
std::istringstream convert(line);
std::getline(convert(line, name);
convert >> grade;
insert(name, grade);
std::cout << name << " " << grade << "\n";
}
Хотя есть еще один шаг за этим: поскольку имя и класс (по-видимому) связаны (по-видимому), я, вероятно, определю для них класс и напишу экстрактор, чтобы получить объект этого типа из потока:
class whatever {
std::string name;
int grade;
friend std::istream &operator>>(std::istream &is, whatever &w) {
std::getline(is, w.name, '\t');
is >> w.grade;
is.ignore(4096, '\n');
return is;
}
};
Имея это в виду, мы можем читать данные из файла немного проще:
whatever w;
while (myfile >> w) {
insert(w);
std::cout << w.name << " " << w.grade << "\n";
}
Обратите внимание, что в этом случае нам вообще не нужно явно проверять наличие пустых строк — мы просто проверяем, можем ли мы успешно прочитать и преобразовать whatever
из потока, который потерпит неудачу для пустой строки.
Других решений пока нет …