ifstream::eof выдает ошибку типа в операторе if

У меня есть класс A, в котором есть член std::ifstream filestr. В одной из функций класса я проверяю, достиг ли поток eof.

class A
{
private:
   std::ifstream filestr;

public:
   int CalcA(unsigned int *top);  
}

Затем в файле cpp у меня есть

int CalcA(unsigned int *top)
{
   int error;
   while(true)
   {
      (this->filestr).read(buffer, bufLength);

      if((this->filestr).eof);
      {
         error = 1;
         break;
      }
   }
   return error;
}

Я получаю ошибку компиляции

error: argument of type ‘bool (std::basic_ios<char>::)()const’ does not match ‘bool’

Может ли кто-нибудь сказать мне, как правильно использовать eof? Или какие-либо другие причины, по которым я получаю эту ошибку?


person CallMeNorm    schedule 03.09.2012    source источник
comment
Помимо отсутствия круглых скобок, обратите внимание, что использование eof() полезно только для определения причины сбоя операции чтения. Довольно бесполезно использовать его в качестве условия управления циклом.   -  person Dietmar Kühl    schedule 03.09.2012
comment
Две вещи. Во-первых, this-> не нужен в двух местах, где он появляется; это означает, что вы также можете удалить скобки. Во-вторых, как уже упоминалось, eof — это функция; Вы должны позвонить ему. Но это не говорит вам, что вы достигли конца файла; это говорит вам, что вы пытались прочитать за конец файла.   -  person Pete Becker    schedule 03.09.2012


Ответы (3)


eof – это функция, поэтому ее нужно вызывать так же, как и другие функции: eof().

Тем не менее, заданный цикл чтения можно записать более правильно (принимая во внимание другие возможности ошибки, кроме конца файла) без вызова eof(), но превратив операцию чтения в условие цикла :

while(filestr.read(buffer, bufLength)) {
    // I hope there's more to this :)
};
person R. Martinho Fernandes    schedule 03.09.2012

Пытаться

if(this->filestr).eof())

(this->filestr).eof сам по себе является указателем на метод-член. Операторы if требуют выражений типа bool. Итак, вам нужно вызвать метод. Это удастся, потому что он возвращает значение bool.

person André Oriani    schedule 03.09.2012
comment
(this->filestr).eof не является указателем на функцию-член. Если бы это было так, код был бы в порядке, потому что указатели на функции-члены могут быть контекстно преобразованы в bool. Синтаксис указателя на функцию-член — &ClassName::MemberFunctionName. Функции-члены не похожи на функции C: их имена не распадаются на указатели. - person Pete Becker; 03.09.2012

(this->filestr).eof не вызывает функцию. (this->filestr).eof() есть. :-) Это объясняет вашу ошибку.

person obataku    schedule 03.09.2012