任何人都可以告诉我为什么这个方法不能编译?
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*)'
任何帮助将不胜感激。
答案 0 :(得分:26)
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),也会执行cout。通常,eof()函数不是很有用,你应该测试getline()或流提取操作符等函数的返回值。
答案 1 :(得分:9)
阅读编译错误:
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));
}
答案 2 :(得分:3)
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() );
答案 3 :(得分:3)
您应该使用fileName.c_str(),以便将const char *指针传递给myFile构造。
答案 4 :(得分:0)
C ++ 11标准解决了这个缺陷。当std::ifstream myfile(filename);
类型为filename
时,std::string
应该进行编译。