PDA

Visualizza la versione completa : [c++]controllare se un file esiste


cleaner
02-01-2009, 16:50
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".



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

Well
02-01-2009, 18:29
Prova così:


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;
}

cleaner
02-01-2009, 20:29
Siccome poi devo saperlo commentare il codice, mi servirebbe sapere se l'ho interpretato correttamente:



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:


if(doesExist() == false)
{
fstream creafile("prova.txt",ios::out|ios::app):
creafile << "12345678910";
creafile.close();
}

oregon
02-01-2009, 22:59
Hai saltato una linea (importante) del codice che ti e' stato suggerito.

cleaner
02-01-2009, 23:45
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::out




dico bene??

MItaly
03-01-2009, 13:00
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::out
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?

cleaner
03-01-2009, 13:27
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..

MItaly
03-01-2009, 13:43
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.

cleaner
03-01-2009, 13:48
ok ti ringrazio :zizi:

MItaly
03-01-2009, 14:08
:ciauz:

Loading