Вы наблюдаете то же поведение, что и многие другие начинающие программисты на С ++. Прочитайте, например, этот вопрос .
В результате in.eof()
устанавливается на true
после того, как вы попытались что-то прочитать из in
, и операция не удалась, так как данных больше не было. Когда операция чтения завершается неудачно из-за конца файла, она устанавливает и , eofbit
и failbit
. Когда поток находится в состоянии сбоя, задокументирована функция tellg
, возвращающая -1
.
Чтобы решить проблему, проверьте eof
после выполнения операции чтения и до , когда вы делаете что-либо еще. Более того, убедитесь, что операция просто «провалилась», так как вы не хотите различать конец файла и неправильный ввод (например, если вместо баланса для числа передается строка, ваш код вводит бесконечный цикл):
for(;;)
{
in>>balance>>name;
if(!in)
break;
if(balance==0)
cout<<balance<<" "<<name<<endl;
cout<<in.tellg()<<endl;
}
Условие !in
проверяет, установлены ли failbit
или badbit
. Вы можете упростить это, переписав так:
while(in>>balance>>name)
{
if(balance==0)
cout<<balance<<" "<<name<<endl;
cout<<in.tellg()<<endl;
}