Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703

    [c++]controllare se un file esiste

    come controllo se un file esiste?!
    ho provato a fare una cosa del genere..di fatto funziona, ma non so quanto possa valere come codice..quello che temo è che possano succedere dei casini con i flussi, si riferiscono entrambi allo stesso file "prova.txt".

    codice:
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        fstream prova("prova.txt",ios::in);
        if(!prova)
        {
            fstream x ("prova.txt",ios::out);
            x.close();
        }
    
        prova.close();
        return 0;
    }
    Mi sono dato da fare comunque con libri ecc, avevo scovato specificatori interessanti come:
    - nocreate
    - noreplace
    ma purtroppo non sono supportati dal compilatore gcc, in quanto mi da un errore codeblock.
    P.s non voglio essere vincolato in ambiente win. grazie.

  2. #2
    Utente di HTML.it L'avatar di Well
    Registrato dal
    Jan 2009
    Messaggi
    37
    Prova così:

    codice:
    bool doesExist(const char *filepath) 
    { 
    bool exists = false; 
    fstream fin; 
    fin.open(filepath,ios::in); 
    if( fin.is_open() ) 
    exists=true; 
    fin.close(); 
    return exists; 
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    Siccome poi devo saperlo commentare il codice, mi servirebbe sapere se l'ho interpretato correttamente:

    codice:
    bool doesExist(const char *filepath)   // funzione di nome doesExist con parametro la path file
    { 
    bool exists = false;  // la funzione viene settata su valore false
    fstream fin;  // nome del flusso di stream "fin"
    fin.open(filepath,ios::in);  // apro il file in lettura
    if( fin.is_open() )  //condizionale, se si apre(quindi esiste)variabile boolena exists sett. su true
    fin.close(); //chiudo il flusso
    return exists; //?????ritorna lo stato della variabile booleana????
    }
    ok, poi dovrò fare un'altra funzione che di fatto crea il file in caso di mancata esistenza..quindi, se ho interpretato correttamente:
    codice:
    if(doesExist() == false)
    {
        fstream creafile("prova.txt",ios::out|ios::app):
        creafile << "12345678910";
        creafile.close();
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Hai saltato una linea (importante) del codice che ti e' stato suggerito.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    ah si giusto ^^ sorry

    exists=true;


    Quindi se il file si apre la variabile exists viene settata su true.

    quindi alla fine di tutto io ho:

    se la variabile exists è settata su true, e quindi il file esiste, lo apro in modalità ios::app
    altrimenti se exists è settato su false, e quindi NON esiste il fil file, lo apro in modalità ios:ut




    dico bene??

  6. #6
    se la variabile exists è settata su true, e quindi il file esiste, lo apro in modalità ios::app
    altrimenti se exists è settato su false, e quindi NON esiste il fil file, lo apro in modalità ios:ut
    1. Non devi esaminare direttamente la variabile exists, ma il valore restituito dalla funzione doesExist.
    2. In ogni caso questo codice non è sicuro al 100%; il file potrebbe esistere ma il tuo utente potrebbe non avere i permessi per accedervi, per cui non riusciresti ad aprirlo né in lettura né in scrittura, oppure i permessi potrebbero essere cambiati tra la chiamata a doesExist e l'apertura del file in scrittura.
    3. In generale comunque il distinguo che fai è assolutamente inutile: perché non apri il file sempre in modalità ios::app?
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    si in effetti ho sbagliato,la modalità può essere comunque ios::app, se esiste ci scrivo dentro senza modificare la parte già presente..

    mi hai detto che questo codice non è sicuro al 100%, ma tra i due(cioè il mio postato all'inzio e questo) quale mi consiglieresti?!..alla fine entrambi funzionano..

  8. #8
    Nessuna delle due proposte è sicura per quanto riguarda i punti che ho detto prima; delle due comunque preferisco quella di Well perché è incapsulata in una funzione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    ok ti ringrazio

  10. #10
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.