2009-11-02 9 views
12

J'essaie de passer une chaîne de main à une autre fonction. cette chaîne est un nom de fichier texte qui doit être affiné. pour autant que je peux voir, je passe la chaîne bien, mais quand j'essaie d'utiliser ifstream.open(textFileName), ça ne marche pas tout à fait. mais quand je le code manuellement comme ifstream.open("foo.txt"), cela fonctionne très bien. je aurais besoin d'utiliser cette fonction plusieurs fois donc je voudrais être en mesure de passer dans une chaîne de nom de fichier texte ..C++: problème ifstream ouvert avec le passage d'une chaîne pour le nom de fichier texte

ici est mon principal

#ifndef DATA_H 
#define DATA_H 
#include "Data.h" 
#endif 

#ifndef DATAREADER_H 
#define DATAREADER_H 
#include "DataReader.h" 
#endif 

using namespace std; 

int main() 
{ 
vector<Data*> database = DataReader("foo.txt"); 

return 0; 
} 

tête de DataReader

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

#ifndef DATA_H 
#define DATA_H 
#include "Data.h" 
#endif 

using namespace std; 

vector<Data*> DataReader(string textFile); 

et enfin le DataReader.cpp

#include "DataReader.h" 

using namespace std; 

vector<Data*> DataReader(string textFile) 
{ 
ifstream aStream;  
aStream.open(textFile); //line 11 

i regardé le ifstream.open() et il faut chaîne et un mode en tant que paramètres. pas vraiment sûr de ce qu'il faut faire avec les modes, mais je les ai essayé, mais ils ont donné le même message d'erreur

DataReader.cpp: In function 'std::vector<Data*, std::allocator<Data*> > DataReader(std::string)': 
DataReader.cpp:11: error: no matching function for call to 'std::basic_ifstream<char, std::char_traits<char> >::open(std::string&)' 
/usr/local/lib/gcc/sparc-sun-solaris2.9/4.0.3/../../../../include/c++/4.0.3/fstream:495: note: candidates are: void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>] 

vous remercie d'avance pour toute entrée/suggestions.

Dean

+2

Vous trouverez plus de succès dans la vie si vous mettez vos protections d'inclusion * à l'intérieur * des en-têtes qu'ils doivent protéger. Inclure un en-tête devrait être aussi simple qu'une seule ligne '# include', pas quatre lignes pour l'inclure conditionnellement, où vous devez connaître le nom du symbole de garde de chaque en-tête. Les deux premières lignes de chaque en-tête seront '# ifndef' /' # define' et la dernière ligne sera '# endif'. Vous devriez être capable de trouver des exemples de ceci dans * chaque * entête que vous voyez. –

Répondre

42

les flux standards n'accepte pas standard string, seulement c-string! Donc, passez la chaîne en utilisant c_str():

aStream.open(textFile.c_str()); 
+0

merci beaucoup !! Je pense que j'aurais dû regarder les arguments de plus près ..... – user200632

+0

Je pensais que 'c_str()' devrait fonctionner sur la base de l'erreur de compilation, mais je suis un peu surpris que C++ n'ait pas d'option pour transmettre un 'std :: string'. –

+0

il vous suffit de donner à votre compilateur l'indicateur pour utiliser C++ 11 et vous pouvez ensuite passer une chaîne. – NDEthos

3

Essayez ceci:

aStream.open(textFile.c_str()); //line 11 

Je pense que votre code doit prendre la chaîne interne C pour passer à l'appel open(). Note Je ne suis pas dans un compilateur en ce moment, donc je ne peux pas vérifier cela.

Vous pouvez également vérifier la signature du cette méthode:

vector<Data*> DataReader(string textFile); 

Ici, sera prise une copie complète du vecteur quand il est revenu de la méthode, qui pourrait être informatiquement cher. Notez qu'il ne copiera pas les objets de données, mais seulement les pointeurs, mais avec beaucoup de données, cela pourrait ne pas être une bonne idée. De même avec l'entrée de chaîne.

Tenir compte ceci:

2

ifstreamopen prend un pointeur const char* en tant que paramètre, utilisez la fonction c_str() de std::string pour obtenir ce pointeur. Vous pouvez voir la signification des paramètres here

Questions connexes