2009-04-06 2 views
2

Quelqu'un peut-il s'il vous plaît dites-moi pourquoi cette méthode ne compilera pas?Trouver l'erreur dans ce code de lecture de fichier (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"; 

} 

Devrait fonctionner, non? Et pourtant, je reçois toujours le message d'erreur suivant:

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

toute aide serait grandement appréciée.

Répondre

26
ifstream myfile (filename); 

devrait être:

ifstream myfile (filename.c_str()); 

En outre, votre logique de lecture en boucle est faux. Il devrait être:

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

La fonction EOF() que vous utilisez n'a de sens après vous avez essayé de lire lire quelque chose.

Pour voir pourquoi cela fait une différence, considérons le code simple:

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

Si vous exécutez ce type et ctrl-Z ou Ctrl-D pour indiquer EOF immédiatement, le Cout sera effectuée même mais aucune ligne n'a été entrée (à cause de l'EOF). En général, la fonction eof() n'est pas très utile, et vous devriez plutôt tester la valeur de retour de fonctions telles que getline() ou les opérateurs d'extraction de flux.

+0

AAaaaaahh d'accord! Merci beaucoup! – winsmith

+0

Vous n'avez pas besoin d'un mode ouvert? –

+0

@Bill semble que vous ne faites pas. @Neil mais ne sera pas eof() simplement retourner faux la première fois? Parce que cela fonctionne. – winsmith

3

Le constructeur ifstream a la signature suivante

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

Vous devez passer dans un char * constante et un mode, par exemple:

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

Le mode est en option, car il a un valeur par défaut définie, donc vous pouvez simplement utiliser:

ifstream myfile (filename.c_str()); 
3

Vous devez utiliser fileName.c_st r() pour que vous passiez le pointeur const char * à la construction myFile.

9

Lire l'erreur du compilateur:

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

No matching function for call to: Il ne peut pas trouver la fonction que vous essayez d'appeler

std::basic_ifstream >:: - une fonction de membre de ifstream

:basic_ifstream(std::string*) - le constructeur qui prend un string poi nter comme argument

Vous essayez donc de créer un ifstream en passant un pointeur de chaîne à son constructeur. Et il ne peut pas trouver un constructeur qui accepte un tel argument.

Étant donné que vous ne transmettez pas de pointeur de chaîne dans ce qui précède, le code que vous avez publié doit être différent de votre code actuel. Toujours copier/coller lorsque vous posez des questions sur le code. Typos rendent impossible de comprendre le problème. Dans tous les cas, si je me souviens bien, le constructeur n'accepte pas un argument de chaîne, mais seulement un const char *. Alors filename.c_str() devrait faire l'affaire

En dehors de cela, vous pouvez le faire beaucoup plus simple:

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

La norme C++ 11 a résolu ce défaut. std::ifstream myfile(filename); devrait maintenant compiler, quand filename a le type std::string.