Найдите ошибку в коде чтения этого файла (C++)

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

void Statistics::readFromFile(string filename)
{
    string line;
    ifstream myfile (filename);
    if (myfile.is_open())
    {
        while (! myfile.eof() )
        {
            getline (myfile,line);
            cout << line << endl;
        }
        myfile.close();
    }

    else cout << "Unable to open file"; 

}

Должно работать, да? Тем не менее, я всегда получаю следующее сообщение об ошибке:

Line Location Statistics.cpp:15: error:
   no matching function for call to
   'std::basic_ifstream<char, std::char_traits<char> >::
      basic_ifstream(std::string*)'

любая помощь будет принята с благодарностью.


person winsmith    schedule 06.04.2009    source источник


Ответы (5)


ifstream myfile (filename);

должно быть:

ifstream myfile (filename.c_str() );

Кроме того, ваша логика цикла чтения неверна. Так должно быть:

while ( getline( myfile,line ) ){
   cout << line << endl;
}

Используемая вами функция eof() имеет смысл только после того, как вы попытались что-то прочитать.

Чтобы понять, почему это имеет значение, рассмотрим простой код:

int main() {
    string s; 
    while( ! cin.eof() ) {
        getline( cin, s );
        cout << "line is  "<< s << endl;
    }
}

Если вы запустите это и наберете ctrl-Z или ctrl-D, чтобы указать EOF немедленно, cout будет выполнен, даже если на самом деле не было введено ни одной строки (из-за EOF). В общем, функция eof() не очень полезна, и вместо этого вам следует проверять возвращаемое значение таких функций, как getline() или операторов извлечения потока.

person Community    schedule 06.04.2009
comment
Аааааааа ладно! Огромное спасибо! - person winsmith; 06.04.2009
comment
@Билл, кажется, нет. @Neil, а не будет ли eof() просто возвращать false в первый раз? Потому что это работает. - person winsmith; 06.04.2009
comment
@bill nope - если потоки открыты для чтения - i означает ввод - person ; 06.04.2009
comment
@Neil: Верно, мое невежество. В документе, на который я ссылался, даже показано значение по умолчанию ios_base::in. Дух. :) - person Bill the Lizard; 06.04.2009

Прочитайте ошибку компилятора:

no matching function for call to 'std::basic_ifstream >::basic_ifstream(std::string*)

No matching function for call to: Не удается найти функцию, которую вы пытаетесь вызвать

std::basic_ifstream >:: — функция-член ifstream

:basic_ifstream(std::string*) — конструктор, который принимает указатель на строку в качестве аргумента.

Итак, вы пытаетесь создать ifstream, передав указатель на строку его конструктору. И он не может найти конструктор, который принимает такой аргумент.

Поскольку вы не передаете указатель на строку выше, код, который вы разместили, должен отличаться от вашего фактического кода. Всегда копируйте/вставляйте, когда спрашиваете о коде. Опечатки не позволяют разобраться в проблеме. В любом случае, насколько я помню, конструктор не принимает строковый аргумент, а только const char*. Итак, filename.c_str() должен помочь

Кроме того, вы можете сделать это намного проще:

ifstream myfile (filename);
    std::copy(std::istream_itrator<std::string>(myfile),
              std::istream_itrator<std::string>(),
              std::ostream_iterator<std::string>(std::cout));
}
person jalf    schedule 06.04.2009

Вы должны использовать fileName.c_str(), чтобы передать указатель const char* конструкции myFile.

person Naveen    schedule 06.04.2009

Конструктор ifstream имеет следующую подпись

explicit ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );

Вам нужно передать константу char* и режим, например:

ifstream ifs ( "test.txt" , ifstream::in );

Этот режим является необязательным, поскольку для него определено значение по умолчанию, поэтому вы можете просто использовать:

ifstream myfile ( filename.c_str() );
person Bill the Lizard    schedule 06.04.2009

Стандарт C++11 устранил этот недостаток. std::ifstream myfile(filename); теперь должен компилироваться, когда filename имеет тип std::string.

person Community    schedule 06.04.2015