2011-12-18 10 views
5

¿La función open tiene algún tipo de restricción en cuanto a qué tipo de valor de cadena se pasa?error de compilación: ifstream :: open solo acepta valores de cadena entre comillas "" y no variables de cadena

ifstream file; 
string filename = "output.txt"; 
file.open(filename); 

Me trataron de pasar un valor de cadena con una variable de cadena, pero cuando se trata de compilar, el resultado es ...

agent.cpp:2:20: error: ofstream: No such file or directory 
agent.cpp: In function ‘std::string readingline(std::string)’: 
agent.cpp:11: error: aggregate ‘std::ifstream file’ has incomplete type and cannot be  defined 
agent.cpp: In function ‘int main()’: 
agent.cpp:44: error: aggregate ‘std::ofstream writefile’ has incomplete type and cannot be defined 

Por otro lado, cuando acabo de pasar una cadena valor entre comillas como "filename.txt", compila bien y funciona bien.

ifstream file; 
file.open("output.txt"); 

¿Por qué es este el caso?

¿Hay alguna manera de resolver este problema?

+0

¿Intentó pasar un puntero a una matriz de caracteres? – neeKo

+2

Ver [¿Por qué (i | o) fstream toma un parámetro const char * para un nombre de archivo?] (Http://stackoverflow.com/questions/5972151/why-does-iofstream-take-a-const-char- parameter-for-a-file-name) –

Respuesta

5

Lamentablemente, así es como el constructor y open de std::(i|o)fstream están definidos por la norma. Use file.open(filename.c_str()).

Algunas bibliotecas estándar proporcionan una extensión que permite std::string como parámetro, p. Ej. Estudio visual.

+0

Gracias Xeo. Usando 'file.open (filename.c_str())' resuelto. –

+1

Ya no es una extensión, sino que cumple con el estándar C++ 11. –

+0

@Bo: Espera, ¿tenemos esos en C++ 11? Debo haber perdido eso. * va al destello a través del estándar * – Xeo

1

creo que los mensajes de error pueden no estar relacionado con el código en cuestión, pero open toma un estilo C const char* y no un C++ string. Tendrá que usar filename.c_str() en la llamada para que funcione correctamente.

+0

Gracias Mark B por la sugerencia. –

1

Tengo el problema de irme incluyendo fstream y pasando filename.c_str() en lugar de solo filename.

El mensaje sobre un tipo incompleto es porque le falta un encabezado (probablemente de todos modos, no mostró un ejemplo completo).

Y open toma una cadena estilo c, no la clase string.

+0

Gracias tpg2114. –

Cuestiones relacionadas