2009-04-06 11 views
2

誰もこのメソッドがコンパイルされない理由を教えてください。このファイルの読み込みコードにエラーが見つかりました(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*)' 

任意の助けをいただければ幸いです。

答えて

26
ifstream myfile (filename); 

は次のようになります。

ifstream myfile (filename.c_str()); 

また、あなたの読み取りループロジックが間違っています。それは次のようになります。あなたが使用している

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

EOF()関数は、あなたが何かを読んで読んしようとしてい後にのみ意味があります。これは違いがなぜ

を検討し、簡単なコードを参照するには:あなたがこれを実行し、型CTRL-ZまたはCtrl-Dは、直ちにEOF を示すために、場合

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

を、裁判所未満であっても実行されます実際に入力された行はありません(EOFのため)。一般に、eof()関数はあまり有用ではないので、代わりにgetline()やストリーム抽出演算子などの関数の戻り値をテストする必要があります。

+0

AAaaaaahh大丈夫です!本当にありがとう! – winsmith

+0

オープンモードは必要ありませんか? –

+0

@Billはあなたがいないようです。 @ Neeilですが、eof()は初めてfalseを返すだけでしょうか?それは動作するからです。 – winsmith

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

fileName.c_st r()を使用して、const char *ポインターをmyFile構造体に渡します。

9

コンパイラエラー読む:それはあなたが

std::basic_ifstream >::を呼び出そうとしている機能を見つけることができません

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

No matching function for call to:を - はifstream

のメンバ関数を:basic_ifstream(std::string*) - 文字列poiをとるコンストラクタ引数としてのnter

したがって、コンストラクタに文字列ポインタを渡して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)); 
} 
0

C++ 11標準では、この不具合を解決しました。 filenameのタイプがstd::stringの場合、std::ifstream myfile(filename);がコンパイルされます。

関連する問題