2009-04-06 6 views
2

Kann mir bitte jemand sagen, warum diese Methode nicht kompilieren wird?Finde den Fehler in dieser Datei lesen Code (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"; 

} 

Sollte funktionieren, oder? Doch ich bekomme immer folgende Fehlermeldung:

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

jede mögliche Hilfe würde sehr geschätzt werden.

Antwort

26
ifstream myfile (filename); 

sollte sein:

ifstream myfile (filename.c_str()); 

Auch Ihre Lese-Schleife Logik falsch ist. Es sollte sein:

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

die EOF() Funktion, die Sie verwenden, ist nur dann sinnvoll nach Sie etwas gelesen haben versucht, lesen.

Um zu sehen, warum dies einen Unterschied macht, sollten Sie den einfachen Code:

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

Wenn Sie diese und geben Sie Strg-Z oder Strg-D laufen EOF, um anzuzeigen, sofort, wird die cout auch durchgeführt werden, obwohl keine Zeile eingegeben wurde (wegen EOF). Im Allgemeinen ist die eof() - Funktion nicht sehr nützlich, und Sie sollten stattdessen den Rückgabewert von Funktionen wie getline() oder die Stream-Extraktionsoperatoren testen.

+0

AAaaaaahh okay! Vielen Dank! – winsmith

+0

Brauchen Sie keinen offenen Modus? –

+0

@ Bill scheint Sie nicht. @Neil aber wird nicht eof() einfach das erste Mal falsch? Weil es funktioniert. – winsmith

3

Der ifstream Konstruktor hat die folgende Signatur

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

Sie müssen in einem konstanten char * und einem Modus passieren, zum Beispiel:

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

Der Modus ist optional, da es eine hat Standardwert definiert, so können Sie einfach verwenden:

ifstream myfile (filename.c_str()); 
3

Sie sollten fileName.c_st verwenden r(), so dass Sie den Zeiger const char * an die myFile-Konstruktion übergeben.

9

den Compilerfehler lesen:

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

No matching function for call to: Es kann die Funktion nicht finden Sie

std::basic_ifstream >:: zu nennen sind versuchen - eine Member-Funktion von ifstream

:basic_ifstream(std::string*) - der Konstruktor, der eine Zeichenfolge Poi nimmt nter als Argument

Sie versuchen also, einen ifstream zu erstellen, indem Sie einen String-Zeiger an seinen Konstruktor übergeben. Und es kann keinen Konstruktor finden, der ein solches Argument akzeptiert.

Da Sie oben keinen Zeichenfolgenzeiger übergeben, muss sich der Code, den Sie gepostet haben, von Ihrem tatsächlichen Code unterscheiden. Kopieren Sie immer, wenn Sie nach Code fragen. Tippfehler machen es unmöglich, das Problem zu lösen. In jedem Fall akzeptiert der Konstruktor, wie ich mich erinnere, kein String-Argument, sondern nur ein const char *. So filename.c_str() sollte den Trick

Abgesehen davon, können Sie diese viel einfacher tun:

ifstream myfile (filename); 
    std::copy(std::istream_itrator<std::string>(myfile), 
       std::istream_itrator<std::string>(), 
       std::ostream_iterator<std::string>(std::cout)); 
} 
0

Die C++ 11-Standard, diesen Mangel behoben ist. std::ifstream myfile(filename); sollte jetzt kompilieren, wenn filename den Typ std::string hat.