2009-11-02 22 views
12

Estoy tratando de pasar una cadena de la función principal a otra. esta cadena es un nombre de archivo de texto que debe ser abierto. por lo que puedo ver, estoy pasando la cuerda bien, pero cuando trato de usar ifstream.open(textFileName), no funciona del todo. pero cuando lo codifico manualmente como ifstream.open("foo.txt"), funciona bien. Yo tendría que utilizar esta función varias veces, así que me gustaría ser capaz de pasar de una cadena de nombre de archivo de texto ..C++: ifstream problema abierto al pasar una cadena para el nombre de archivo de texto

aquí es mi principal cabecera

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

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); 

y finalmente el DataReader.cpp

#include "DataReader.h" 

using namespace std; 

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

busqué la ifstream.open() y se necesita una cadena y un modo como parámetros. no muy seguro de qué hacer con los modos, pero los probé pero dio el mismo mensaje de error

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

gracias de antemano por cualquier entrada y/o sugerencias.

Dean

+2

Encontrará mayor éxito en la vida si coloca sus guardias de inclusión * dentro * de los encabezados que deben proteger. Incluir un encabezado debe ser tan simple como una sola línea '# include', no cuatro líneas para incluirlo condicionalmente, donde se requiere que conozca el nombre del símbolo de guarda de cada encabezado. Las primeras dos líneas de cada encabezado serán '# ifndef' /' # define' y la última línea será '# endif'. Debería poder encontrar ejemplos de esto en * cada * encabezado que alguna vez veas. –

Respuesta

42

los flujos estándares no acepta una standard string, solamente c-string! Así que pase la cadena usando c_str():

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

muchas gracias !! Creo que debería haber visto los argumentos más de cerca ... – user200632

+0

Pensé que 'c_str()' debería funcionar en función del error de compilación, pero estoy sorprendido de que C++ no tenga la opción de pasar un 'std :: string'. –

+0

solo tiene que darle a su compilador la bandera para usar C++ 11 y luego puede pasar una cadena. – NDEthos

3

Prueba esto:

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

creo que el código necesita para tomar la cadena interna C para pasar a la llamada open(). Tenga en cuenta que no estoy en un compilador en este momento, por lo que no puedo verificar esto.

También es posible que desee comprobar la firma del este método:

vector<Data*> DataReader(string textFile); 

En este caso, se tomará una copia completa del vector cuando se devuelve desde el método, que podría ser costoso computacionalmente. Tenga en cuenta que no copiará los objetos de datos, solo los punteros, pero con una gran cantidad de datos podría no ser una buena idea. De manera similar con la entrada de cadena.

consideran este lugar:

2

ifstreamopenconst char* toma un puntero como parámetro, utilice la función de c_str()std::string para obtener este puntero. Puede ver el significado de los parámetros here

Cuestiones relacionadas