PDA

View Full Version : [C] Alcuni quesiti


Manugal
16-03-2006, 19:35
Ciao :)

Volevo sapere come si fa a vedere se un file esiste già (nel momento in cui lo creo) e quindi restituire un errore. Inoltre volevo sapere come si fa a vedere se un file che voglio creare ha lo stesso nome di uno già esistente (e riportare l'errore). Grazie.

Xalexalex
16-03-2006, 20:08
Per vedere se il file esiste...

fp=fopen("Nome_del_file_da_controllare");
if(fp==NULL)
printf("Il file non esiste\n");
else
{...}

Ovviamente fp deve essere un puntatore a file prec. dichiarato.

Per vedere se un file che vuoi creare ha lo stesso nome di uno già creato basta che esegui lo stesso test con il nome del file.
Se esso esiste verrà fp punterà ad esso, altrimenti esso varrà NULL.

Spero di essre stato chiaro.

Ciao,
Alex

Manugal
16-03-2006, 20:15
Grazie. Io pensavo che fp==NULL fosse dovuto al fatto che non c'era più memoria allocabile. Allora a questo punto mi sorge spontaneo chiederti come si fa a vedere se non c'è più memoria allocabile per un file. Grazie ;)

AbuJaffa
16-03-2006, 20:30
Grazie. Io pensavo che fp==NULL fosse dovuto al fatto che non c'era più memoria allocabile. Allora a questo punto mi sorge spontaneo chiederti come si fa a vedere se non c'è più memoria allocabile per un file. Grazie ;)

Se non vado errato, la "fopen" resituisce NULL se l'apertura del file non è andata a buon fine, e questo può dipendere da parecchi motivi incluso la non necessaria memoria per allocare il file in questione. Comunque con "errno" puoi controllare che tipo di errore si è presentato. ;)

Manugal
16-03-2006, 22:56
Grazie. A me cmq serve solamente che rientri in quell'ottica di errore (e cioè dell'allocazione di memoria). Non mi serve sapere nello specifico da cosa è causato il NULL. Quindi se mi dici così ripropongo le prime due domande :D

sottovento
17-03-2006, 07:32
Grazie. A me cmq serve solamente che rientri in quell'ottica di errore (e cioè dell'allocazione di memoria). Non mi serve sapere nello specifico da cosa è causato il NULL. Quindi se mi dici così ripropongo le prime due domande :D

Per vedere se un file esiste, se non ti piace la soluzione di cui sopra, potresti usare la stat(), la quale ti riporta tutte le informazioni relative a quel file.
Ricorda di includere <sys/stat.h>
High Flying
Sottovento

Qu@ker
17-03-2006, 08:02
Per completezza, ti segnalo che potresti usare anche access().
Per esempio:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
char nomefile[256] = "test.txt";
int result;

if (argc == 2) {
strncpy(nomefile, argv[1], 255);
nomefile[255] = '\0';
}
result = access(nomefile, F_OK);
if (result == 0) {
puts("Il file esiste.");
} else {
if (errno == ENOENT)
puts("Il file non esiste!");
else
printf("Errore: %d (%s)\n", errno, strerror(errno));
}

return 0;
}

Manugal
17-03-2006, 10:24
Grazie. Se sono librerie di sistema non le posso usare, sto facendo un progetto in C per l'Università. Al massimo posso usare librerie POSIX dato che verranno compilati su macchine Unix. ;)

Manugal
17-03-2006, 12:06
Mi potete dare una spiegazione della funzione access()? Non la trovo da nessuna parte. Inoltre io questa funzione non devo inserirla nel main ma la devo inserire all'interno di una funzione che mi controlli appunto se un file esiste oppure no. Quindi credo che sia un po' diverso.

Manugal
17-03-2006, 14:10
up :rolleyes:

ilsensine
17-03-2006, 14:14
Grazie. Se sono librerie di sistema non le posso usare, sto facendo un progetto in C per l'Università. Al massimo posso usare librerie POSIX dato che verranno compilati su macchine Unix. ;)
int fd = open("path al file", O_RDWR|O_CREAT|O_EXCL, 0644);

Se il file esiste, la open fallisce (viene ritornato -1) ed errno vale EEXIST. Questa tecnica non è affidabile se il file è su uno share nfs, altrimenti puoi tranquillamente utilizzarla.

Qu@ker
18-03-2006, 00:05
Grazie. Se sono librerie di sistema non le posso usare, sto facendo un progetto in C per l'Università. Al massimo posso usare librerie POSIX dato che verranno compilati su macchine Unix. ;)


ddd@big:~$ man access | sed -ne '99,+1p'
CONFORMING TO
SVID, AT&T, POSIX, X/OPEN, BSD 4.3
ddd@big:~$

Dai un'occhiata in rete per la sintassi (ad es. qui (http://www.linuxpakistan.net/man.php?query=access&apropos=0&section=0&type=2)).