Question c ++: problème ouvert ifstream avec le passage d'une chaîne pour le nom du fichier texte [dupliquer]


Cette question a déjà une réponse ici:

J'essaie de passer une chaîne de main à une autre fonction. cette chaîne est un nom de fichier texte à supprimer. autant que je puisse 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"), ça marche très bien. Je devrais utiliser cette fonction plusieurs fois, donc je voudrais pouvoir transmettre une chaîne de nom de fichier texte.

voici 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; 
}

en-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

J'ai cherché le ifstream.open () et il prend une chaîne et un mode comme paramètres. pas vraiment sûr quoi faire avec les modes, mais je les ai essayés 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>]

merci d'avance pour toute contribution / suggestion.

doyen


12
2017-11-02 17:36


origine


Réponses:


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

aStream.open(textFile.c_str());

44
2017-11-02 17:40



Essaye ça:

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

Je pense que votre code doit prendre la chaîne C interne pour passer à l'appel open (). Notez que je ne suis pas à un compilateur maintenant, donc je ne peux pas vérifier ceci.

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

vector<Data*> DataReader(string textFile);

Ici, une copie complète du vecteur sera prise quand il sera renvoyé par la méthode, ce qui pourrait coûter cher. Notez que cela ne copiera pas les objets de données, mais uniquement 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.

Considérez ceci à la place:

void DataReader( const string& textFile, vector<Data*>& dataOut );

3
2017-11-02 17:40



ifstream  open prend un const char* pointeur comme paramètre, utiliser c_str() fonction de std::string pour obtenir ce pointeur. Vous pouvez voir la signification des paramètres ici


2
2017-11-02 17:41