Чтение из .txt

У меня есть файл .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? у моего друга есть именно эта вещь, но его нет.

0

Решение

Во-первых, измените ваш цикл на что-то вроде:

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 из потока, который потерпит неудачу для пустой строки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]