Найдите ошибку в этом коде чтения файла (C ++) - PullRequest
2 голосов
/ 06 апреля 2009

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

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*)'

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

Ответы [ 5 ]

26 голосов
/ 06 апреля 2009
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 , вызов будет выполнен, даже если на самом деле не было введено ни одной строки (из-за EOF). В общем, функция eof () не очень полезна, и вам следует вместо этого проверять возвращаемое значение функций, таких как getline () или операторов извлечения потока.

9 голосов
/ 06 апреля 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));
}
3 голосов
/ 06 апреля 2009

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

3 голосов
/ 06 апреля 2009

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

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

Вам необходимо передать постоянный символ * и режим, например:

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

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

ifstream myfile ( filename.c_str() );
0 голосов
/ 06 апреля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...