PDA

Visualizza versione completa : file e C


NS-1
07-07-2004, 11.39.29
in C, come posso capire se un file esiste già? :eek:

grazie...

Alhazred
07-07-2004, 11.51.49
Cosa intendi fare?
Vuoi solo sapere se esiste, oppure vuoi fare in modo che se già esiste non venga sovrascritto?

NS-1
07-07-2004, 11.54.15
se esistente non deve essere possibile sovrascriverlo...

ho risolto provando ad aprirlo in lettura e se ci riesco, richiedo ancora il nome del file... (senza scrivergli sopra)

ci sono altri modi?

P8257 WebMaster
07-07-2004, 11.56.53
Si .. questo era un modo .. altro modo era utilizzare la chiamata di sistema "stat()"

http://www.scit.wlv.ac.uk/~jphb/spos/notes/calls/stat.html#stat

Bye :cool:

Alhazred
07-07-2004, 11.57.08
Si, la struttura di fopen è questa:

FILE *fopen( const char *filename, const char *mode );

il primo parametro è il nome del file, il secondo è il modo di accesso, se specifichi a+ il file può essere letto e scritto, ma la scrittura avviene solo a iniziare dalla fine del file.
Se il file non esiste viene creato.

NS-1
07-07-2004, 12.09.31
grazie ragazzi...
;) (B) (D) (B) ;)

NS-1
07-07-2004, 12.37.49
tutto ok... solo una cosa non riesco a controllare...

se il nome del file inserito dall'utente contiene caratteri non validi, il file non viene creato, come posso intercettare questo errore?
magari evitando lo switch dei caratteri inseriti o il controllo uno ad uno dell'array di caratteri... :D

P8257 WebMaster
07-07-2004, 12.44.59
Queste funzioni possono essere monitorate molto più approfonditamente .. rispetto al semplice controllo del return != NULL, esse valorizzano "errno()" secondo una delle costanti predefinite nell'header <errno.h>, una di queste costanti può fare al caso tuo per verificare che la modalità di apertura del file non sia errata.

Bye :cool:

P8257 WebMaster
07-07-2004, 12.45.36
per info su errno:

http://www.opengroup.org/onlinepubs/009695399/basedefs/errno.h.html

Bye :cool:

NS-1
07-07-2004, 12.59.59
per provare ho sostituito:


while((ptrFile = fopen(nomeFile,"r")) != NULL){

con

while((ptrFile = fopen(nomeFile,"r")) == EEXIST){



perchè non funziona? come devo fare il controllo?

NS-1
07-07-2004, 15.16.23
cosa vuol dire? :confused:


The ISO C standard only requires the symbols [EDOM], [EILSEQ], and [ERANGE] to be defined.

P8257 WebMaster
08-07-2004, 08.58.51
NS-1 ha scritto:
per provare ho sostituito:


while((ptrFile = fopen(nomeFile,"r")) != NULL){

con

while((ptrFile = fopen(nomeFile,"r")) == EEXIST){



perchè non funziona? come devo fare il controllo?

Con questa sintassi tu provi ciclicamente ad aprire un file, riassegnando ogni volta il puntatore .. è estremamente inefficiente e pericolosa .. inoltre nel secondo caso non funziona perché il ptrFile non può avere valore di EEXIST....

Un puntatore può contenere un indirizzo di memoria oppure NULL e non può avere altro valore .. quindi la condizione del while non è mai soddisfatta causando un ciclo infinito.

Devi leggere "errno()" che viene valorizzata a seconda delle costanti elencate .. è qui che le funzioni "depositano" il loro risultato ed errno() ti permette di leggerlo



if((ptrFile = fopen(nomeFile,"w")) != NULL)
{
if(errno() == EEXIST)
{
printf("File già esistente");
}
}



Nell'esempio ho cambiato "r" con "w" per un semplice motivo:
se il file viene aperto per lettura è già implicito che esista, altrimenti ptfFile avrebbe il valore NULL ed errno sarebbe valorizzata come ENOENT (se non ricordo male)...

Bye :cool:

NS-1
08-07-2004, 09.02.42
grazie... :p

ma, posso sapere dove avete imparato tutte queste cose? internet, libri e lavoro? :eek:


ciao (B)

Ns-1

P8257 WebMaster
08-07-2004, 09.03.12
NS-1 ha scritto:
cosa vuol dire? :confused:


The ISO C standard only requires the symbols [EDOM], [EILSEQ], and [ERANGE] to be defined.



Una notazione di cui, a parer mio, puoi altamente fregartene .. dice che lo standard ISO di C prevede la ridefinizione di queste costanti ... che dovresti fare manualmente

Bye :cool:

P8257 WebMaster
08-07-2004, 09.04.59
NS-1 ha scritto:
grazie... :p

ma, posso sapere dove avete imparato tutte queste cose? internet, libri e lavoro? :eek:


ciao (B)

Ns-1

Gaurda, personalmente lo faccio per professione e per passione .. ;) quindi .. volente o nolente .. :)

Bye :cool:

NS-1
08-07-2004, 09.08.03
non hai bisogno di un apprendista stregone? :D

P8257 WebMaster
08-07-2004, 09.10.51
NS-1
non hai bisogno di un apprendista stregone? :D

Guarda, il ruolo del professore mi è sempre stato un po' "stretto"... continuiamo a discuterne insieme qui .. così manteniamo viva e interessata la community .. e speriamo che cresca su questo sito... :)

Bye :cool:

NS-1
08-07-2004, 09.38.22
Ok... :D ...

...ho una domanda... in C c'è un'istruzione che elimina un N elemento dall'array e scala gli altri di conseguenza?

Lo chiedo perchè nei miei esperimenti lo faccio spesso a mano... è anche vero che posso farmi una funzione e riutilizzarla, però se già c'è... :p ... se non sbaglio in C++ dovrebbe essere Splice()

P8257 WebMaster
08-07-2004, 09.43.12
Guarda, onestamente non lo so, le diverse volte in cui sono stato COSTRETTO a farlo, me la sono costruita ad hoc...

Se l'array shifting interessa pochi elementi ti CONSIGLIO CALDAMENTE di tenere l'array com'é .. senza rendela contigua.. perché è un'operazione estremamente poco efficiente..

Se invece nell'array hai diversi "buchi" che ti danno fastidio e vuoi eliminarli .. allora costruiscitela ad hoc.. (è un consiglio ... perché anche se ci fosse .. personalmente non mi fiderei dell'efficienza dell'implementazione).

Bye :cool:

NS-1
08-07-2004, 09.49.44
ok, penso che avere il controllo "totale" sul proprio prog sia preferibile...

Grazie ancora (B) (B) (B) (B) (B) (B) (B) (B)


p.s. non berle tutte in una volta... ;)