PDA

Visualizza la versione completa : [C++] Usare indirizzi di file dati in input


il_dordollano
12-06-2012, 13:44
Posso far aprire al programma un file il cui nome o indirizzo viene dato in input?

Ho già provato questo:



string indirizzo;
cout << "Inserisci l'indirizzo";
cin >> indirizzo;

ifstream file (indirizzo);



ma, ovviamente, non funziona.

MItaly
12-06-2012, 13:50
Intendi indirizzo internet (URL)?

il_dordollano
12-06-2012, 13:51
Originariamente inviato da MItaly
Intendi indirizzo internet (URL)?

No, indirizzo nel senso di percorso del file. Tipo: "/home/user/Documenti/Programmazione/Immagini/file.xpm"

Scara95
12-06-2012, 13:55
In realtà quel metodo funziona se non ci sono spazi nel percorso specificato...

il_dordollano
12-06-2012, 13:59
Originariamente inviato da Scara95
In realtà quel metodo funziona se non ci sono spazi nel percorso specificato...

A me da questo errore:


Programmaasd.cpp:32:33: error: no matching function for call to ‘std::basic_ifstream<char>::basic_ifstream(std::string&)’
Programmaasd.cpp:32:33: note: candidates are:
/usr/include/c++/4.6/fstream:460:7: note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::ios_base::openmode) [with _CharT = char, _Traits = std::char_traits<char>, std::ios_base::openmode = std::_Ios_Openmode]
/usr/include/c++/4.6/fstream:460:7: note: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const char*’
/usr/include/c++/4.6/fstream:446:7: note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.6/fstream:446:7: note: candidate expects 0 arguments, 1 provided
/usr/include/c++/4.6/fstream:420:11: note: std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)
/usr/include/c++/4.6/fstream:420:11: note: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const std::basic_ifstream<char>&’

MItaly
12-06-2012, 14:08
Gli ifstream accettano std::string solo dall'ultima revisione dello standard C++ (C++11), mentre prima avevano solo costruttori a partire da stringhe stile C. Per questo motivo, quando passi la tua stringa all'ifstream, devi convertirla in stringa C usando il metodo c_str():


ifstream file (indirizzo.c_str());


Tra l'altro, usare cin>>indirizzo per leggere il percorso del file non è una buona idea, dato che l'operatore >> smette di leggere al primo spazio che trova, il che significa che non puoi inserire percorsi contenenti spazi. Usa piuttosto la funzione getline, che di default legge fino alla fine della riga:


getline(cin, indirizzo);

il_dordollano
12-06-2012, 14:50
Ora funziona perfettamente, grazie!! È da poco che mi sono imbattuto nelle differenze tra gli standard C++.


Originariamente inviato da MItaly
Tra l'altro, usare cin>>indirizzo per leggere il percorso del file non è una buona idea, dato che l'operatore >> smette di leggere al primo spazio che trova, il che significa che non puoi inserire percorsi contenenti spazi.


Comunque sto programmando su linux e, in questo caso, è indifferente usare il cin o il getline, infatti non posso usare gli spazi negli indirizzi. Al massimo dovrei usare un carattere apposito, se non sbaglio in %s, quindi mi accontento del cin.

MItaly
12-06-2012, 15:01
Su Linux puoi usare tutti gli spazi che vuoi nei percorsi di file... :fagiano:

il_dordollano
12-06-2012, 15:04
Originariamente inviato da MItaly
Su Linux puoi usare tutti gli spazi che vuoi nei percorsi di file... :fagiano:

Non ha mai funzionato :P

Al massimo se la cartella si chiama "Nuova cartella", nell'indirizzo bisognerà scrivere /home/Nuova\ cartella/. (Da terminale, non so se su c++ può funzionare, ora sto facendo un po' di prove)

Scara95
12-06-2012, 15:15
Ma perchè gestire complicazioni nell'input (comunque non funzionanti) quando ti basta una semplice getline...

Loading