2016-07-11 17 views
1

Also das ist der Code:Fehler bei std :: getline

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 

using namespace std; 

void print_file(const ifstream& dat_in) 
{ 
    if(!dat_in.is_open()) 
     throw ios_base::failure("file not open"); 

    string buffer; 
    while(getline(dat_in, buffer)); //error here 
} 

int main() 
{ 
    ifstream dat_in("name_of_the_file.txt"); 

    try{ 
     print_file(dat_in); 
    } 
    catch(ios_base::failure exc){ 
     cout << exc.what() << endl; 
    } 
} 

Und ich erhalte eine Fehlermeldung, dass keine Instanz überladene Funktion std::getline die Argumentliste übereinstimmt. Ich habe diese Zeile Code tausend mal, was das Problem ist jetzt ...

3 IntelliSense: no instance of overloaded function "getline" matches the argument list 
     argument types are: (const std::ifstream, std::string) 
Error 1 error C2665: 'std::getline' : none of the 2 overloads could convert all the argument types 

Antwort

2

Der Täter das ist const:

void print_file(const std::ifstream& dat_in) 
       // ^^^^^ 

Natürlich ist die std::ifstream ‚s Zustand geändert wird, wenn Daten von ihm zu lesen, damit es nicht const sein kann, in dieser Kontext. Sie sollten einfach Ihre Funktionssignatur in

ändern, damit dies funktioniert.


BTW der Name der Funktion print_file ist ziemlich verwirrend für eine Funktion, die tatsächlich aus einer Datei liest.

1

Ihr Code einen Verweis auf einen const ifstream Parameter als ersten Parameter zu std::getline() passiert. Da std::getline() seinen Eingabe-Stream-Parameter ändert, kann er keinen const-Verweis als ersten Parameter haben.

Die Fehlermeldung vom Compiler enthielt eine Liste aller Parameter, und es sollte angezeigt werden, dass der erste Parameter eine Referenz ist.

2

das Problem ist hier

void print_file(const ifstream& dat_in) 

getline ändert sich zwangsläufig die stream, die in übergeben wird. So ändern Sie die oben zu (entfernen const)

void print_file(ifstream& dat_in) 
0

Als Faustregel übergeben und geben Sie alle Streamtypen als Referenz zurück, weder const noch by-value. Denken Sie daran, dass sich const auf das Objekt und nicht auf die Datei bezieht, und dass das Objekt viele Dinge enthält, die sich ändern könnten, selbst wenn es sich bei der Datei um eine schreibgeschützte Datei handelt.