Доберись до линии

Поэтому я пытаюсь создать функцию, которая проверяет файл, но я не могу понять, почему все мои переменные пусты после того, как я getline(p_is, team);

Файл содержит в строке 1 имя хоккея, после этого список имен и фамилий, например:

TeamName
FirstName1
LastName1
FirstName2
LastName2
FirstName3
LastName3

Вот что я делаю:

В моем основном:

ifstream myfile ("example.txt");
bool test = util::validateFile(myfile);

и это моя функция (базовая версия):

bool validateFile(std::istream& p_is)
{
string team = "";
string firstname = "";
string lastname = "";

getline(p_is, team);

while (!p_is.eof()){

    getline(p_is, firstname);
    if (firstname.empty())
    {return false;}

    getline(p_is, lastname);
    if (lastname.empty())
    {return false;}
    }

if (team.empty())
    {return false;}
    else
    {return true;}

Когда я отлаживаю i, он возвращает false, потому что команда пуста... В моем основном я могу напечатать, чтобы утешить поток, и это нормально, и я также попытался восстановить мой.txt, если он был поврежден

любая идея?

РЕДАКТИРОВАТЬ: я добавляю p_is.peek(); и теперь он входит в цикл while, но все еще пуст, мой getline в порядке?

1 ответ

Первый раз firstname пусто (после прочтения team и чередуя firstname а также lastname), функция validateFile возвращается false, Таким образом, вы можете решить проблемы:

bool validateFile(std::istream& p_is) {
  string team, firstname, lastname;

  getline(p_is, team);
  while( p_is ) {
    if( !getline(p_is, firstname) )
      return !team.empty();
    if( firstname.empty() )
      return false;
    if( !getline(p_is, lastname) )
      return !team.empty(); // this could be false;
    if( lastname.empty() )
      return false;
  }

  return !team.empty();
}
Другие вопросы по тегам