Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C++] Usare indirizzi di file dati in input

    Posso far aprire al programma un file il cui nome o indirizzo viene dato in input?

    Ho già provato questo:

    codice:
    string indirizzo;
    cout << "Inserisci l'indirizzo";
    cin >> indirizzo;
    
    ifstream file (indirizzo);
    ma, ovviamente, non funziona.

  2. #2
    Intendi indirizzo internet (URL)?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Intendi indirizzo internet (URL)?
    No, indirizzo nel senso di percorso del file. Tipo: "/home/user/Documenti/Programmazione/Immagini/file.xpm"

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    In realtà quel metodo funziona se non ci sono spazi nel percorso specificato...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Originariamente inviato da Scara95
    In realtà quel metodo funziona se non ci sono spazi nel percorso specificato...
    A me da questo errore:

    codice:
    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>&’

  6. #6
    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():
    codice:
    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:
    codice:
     
    getline(cin, indirizzo);
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    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.

  8. #8
    Su Linux puoi usare tutti gli spazi che vuoi nei percorsi di file...
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Originariamente inviato da MItaly
    Su Linux puoi usare tutti gli spazi che vuoi nei percorsi di file...
    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)

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Ma perchè gestire complicazioni nell'input (comunque non funzionanti) quando ti basta una semplice getline...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.