istream и получи линию

Итак, я пытаюсь создать функцию, которая проверяет файл, но я не могу понять, почему все мои переменные пусты после того, как я 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;}

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

любая идея ?

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


person SKTLZ    schedule 10.04.2014    source источник


Ответы (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();
}
person Massa    schedule 10.04.2014