2011-12-18 7 views
5

La funzione open ha qualche tipo di restrizione su quale tipo di valore stringa viene passato?errore di compilazione: ifstream :: open accetta solo valori stringa tra virgolette "" e non variabili stringa

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

ho cercato di superare un valore di stringa con una variabile stringa, ma quando si tenta di compilare, il risultato è ...

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 

D'altra parte, quando appena passa una stringa valore tra virgolette come "nomefile.txt", compila bene e gira bene.

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

Perché è questo il caso?

C'è un modo per risolvere questo problema?

+0

hai provato a passare un puntatore a un array di caratteri? – neeKo

+2

Vedere [Perché (i | o) fstream utilizza un parametro const char * per un nome file?] (Http://stackoverflow.com/questions/5972151/why-does-iofstream-take-a-const-char- parametro-per-un-nome-file) –

risposta

5

Purtroppo, questo è il modo in cui il costruttore e open di std::(i|o)fstream sono definiti dallo standard. Utilizzare file.open(filename.c_str()).

Alcune librerie standard forniscono un'estensione che consente di impostare std::string come parametro, ad es. Visual Studio.

+0

Grazie, Xeo. Usando 'file.open (filename.c_str())' ha funzionato. –

+1

Non è più un'estensione, ma è conforme allo standard C++ 11. –

+0

@Bo: aspetta, abbiamo quelli in C++ 11? Devo averlo perso. * passa a sfogliare lo standard * – Xeo

1

Penso che i tuoi messaggi di errore potrebbero non essere correlati al codice in questione, ma open prende uno stile C const char* e non un C++ string. Dovrai utilizzare filename.c_str() nella chiamata per farlo funzionare correttamente.

+0

Grazie Mark B per il suggerimento. –

1

Ho risolto il problema includendo fstream e passando filename.c_str() anziché solo filename.

Il messaggio relativo a un tipo incompleto è perché manca un'intestazione (probabilmente in ogni caso, non è stato mostrato un esempio completo).

E open accetta una stringa in stile c, non la classe string.

+0

Grazie tpg2114. –

Problemi correlati