发现此文件中的错误读取代码(C ++)

时间:2009-04-06 11:59:31

标签: c++ file-io

任何人都可以告诉我为什么这个方法不能编译?

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 个答案:

答案 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应该进行编译。