Newsgroup: it.comp.lang.c
Titolo: Ricavare il nome di un file

Salve a tutti,
mi trovo di fronte al seguente problema:
Devo ricavare il nome di un file, il percorso a tale file viene passato come
argomento da linea di comando, il quale verrà poi aperto in lettura tramite
una fopen(), il nome del suddetto file deve essere poi scritto in un altro
file di testo.Ora il problema è che non so come trovare solo il nome del
file e non quello contenuto in argv[],oppure come trovare il percorso
assoluto.
Nessuno può darmi qualche dritta anche solo per indirizzarmi nella strada
giusta?
Ps.il programa è sviluppato su GNU/Linux e dovrà girare su GNU/Linux, oltre
a essere in ANSI C ci terrei a tenere la portabilita del codice.       
 
-- 
"Libertà è la libertà di dire che due più due fa quattro. Garantito ciò,
tutto li resto ne consegue naturalmente."
George Orwell, "1984"  

 a essere in ANSI C ci terrei a tenere la portabilita del codice.       
Se ti interessa particolarmente l'ambito GNU/Linux, o *nix/POSIX in 
generale, ti posso dare di straforo anche il consiglio di guardare 
basename e dirname. Comunque su it.comp.os.linux.development ti sapranno 
dare piu' dritte a riguardo.
-- 
Mat/tia Belletti             - Graduate student @ 
cs.unibo.it
ICQ: 33292311                - email: 
mbel...@cs.unibo.it
IRC: RedGlow                 - site(s): 
http://mbellett.web.cs.unibo.it/
Red...@jabber.linux.it/Gaim
 - Linux user 299762 @ machine 213003

 dare piu' dritte a riguardo.
Grazie ma per questo programma devo attenermi allo standard ANSI C.


 Grazie ma per questo programma devo attenermi allo standard ANSI C.
E allora perche' hai specificato che lavoravi sotto linux...? Vabbe' :-)


 E allora perche' hai specificato che lavoravi sotto linux...? Vabbe' :-)
Ho specificato che lavoro sotto linux, perché questo programma è il
progretto dell' esame di programmazione, che poi verrà compilato e
verificato il funzionamento sotto linux quindi se avevate qualcosa da
consigliarmi che rimaneva sempre nello standard ANSI ma che in definitiva
funzionava solo su linux alla fine mi andava bene ugualmente.
Grazie ancora :).   


 a essere in ANSI C ci terrei a tenere la portabilita del codice.
Se vuoi che il codice sia portabile, ti conviene riscrivere la funzione
daccapo per ognuno dei sistemi operativi che devi supportare.
Come t'è già stato detto, sui sistemi tipo DOS il separatore di path è " \ "
mentre sui sistemi Unix è " / ".
Ma ci possono essere differenze molto più sottili: per esempio, in DOS il
path può essere preceduto da un'indicazione di drive (es. " C: "), in Unix
no; in DOS maiuscole e minuscole sono indifferenti, in Unix no. E poi
esistono anche altri sistemi, per esempio il Mac (mi pare che il separatore
di path sia " § ").
Per mantenere le diverse implementazioni nello stesso sorgente usi
naturalmente la compilazione condizionale. Es.:
const char * BaseName (const char * fullPathname)
{
#if defined(_OS_DOS_)
    /* implementazione DOS e simili */
    ... scrivi il codice qui...
#elif defined(_OS_UNIX_)
    /* implementazione Unix e simili */
    ... scrivi il codice qui...
#else
    /* implementazione di default per sistemi operativi sconosciuti */
   return fullPathname;
#endif
}
Per scrivere le varie implementazioni, ti saranno probabilmente utili alcune
funzioni della libreria standard <string.h> (per esempio strchr e strrcr per
cercare un carattere dentro una stringa, o strstr per cercare una
sottostringa) e forse anche della libreria standard <ctype.h> (per esempio
toupper e tolower per convertire le lettere fra maiuscolo e minuscolo, o
isalpha per sapere se un carattere è una lettera).
Se sei fortunato, per uno o più sistemi operativi saranno già a disposizione
delle librerie NON standard per fare questo lavoro, quindi l'implementazione
potrebbe ridursi a chiamare una funzione.
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/