Newsgroup: it.comp.lang.c
Titolo: Dimensione di un file?

Scusatemi avrei bisogno di una funzione che mi restituisca la dimensione 
di un file. La conoscete?
In altre parole sto lavorando sui file MIDI; con i file midi (siccome 
sono esadecimali) il valore EOF non funziona come dovrebbe e quindi non 
riesco a leggere tutto il file. Siccome non ho trovato il valore giusto 
per terminare la lettura, volevo provare almeno a terminarla conoscendo 
la dimensione del file...
Vi ringrazio per l'aiuto!


Non so se c'è una funzione standard adatta, su un sistema UNIX potresti 
fare così:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
struct stat *myfile;
stat("/path/to/file", myfile);
In questo modo crei un puntatore ad un buffer dentro al quale la 
funzione stat() mette tutte le informazioni riguardanti il file indicato 
dal path, in particolare la dimensione del file è contenuta nella 
variabile st_size della struttura assegnata al buffer (quindi vi accedi 
con myfile->st_size).
Per il resto man stat :)

 Giovanni
Sì questa soluzione è molto migliore :)

 size = fseek(stream, 0, SEEK_END);
Grazie per la soluzione, il problema è che non funziona :)))
La funziona fseek ritorna -1 in caso di fallimento e 0 in caso di 
successo e non l'ultima posizione del file...
Per quanto riguarda EOF, di solito vale -1 e viene confrontato con un 
char, almeno io di solito faccio così:
while((ch = getc(pf)) != EOF){
	....
	operazioni...
	...
}
Il problema è che nei file MIDI il valore di EOF viene utilizzato non 
solo alla fine del file ma anche nel mezzo...quindi il ciclo while esce 
sempre prima della fine del file.
Cmq grazie!

 Il valore EOF e` valido anche per file binari!
Infatti. Devi solo ricordarti (nel caso sfortunato che tu
stia usando Windows...) di aprire il file in modalita' binaria.
(Leggersi la documentazione di fopen non fa male).
ciao,
v.

 Per il resto man stat :)
Ok provo un attimo questa soluzione e ti faccio sapere :)

 sempre prima della fine del file.
Il problema e' che stai programmando senza aver
letto la documentazione !! :-)
EOF NON e' un byte. E' un intero.
getc non restituisce un char, ma un intero.
Quindi tu devi assegnare il valore letto ad un
intero. Poi controlli se e' EOF e se non lo
e' lo puoi usare come se fosse un char.
Non riesco a capire i tuoi problemi con fseek.
Questa funzioncina  restituisce la lunghezza
di un file, passandogli il nome.
#include<stdio.h>
int FileLen(char *nome)
{
   FILE *f;
   int L;
   f=fopen(nome,"rb");  if (!f) return 0;
   fseek(f,0,SEEK_END);
   L=ftell(f);
   fclose(f);
   return L;
}
ciao,
v.

 }
Eh senti hai tutte le ragioni di questo mondo...mi affidavo a ricordi 
che avevo...ti ringrazio molto per la pasienza :)))
Vado subito a provare il tuo codice.

 Vado subito a provare il tuo codice.
Ok funziona!!! GRAZIE!

 }
Evidentemente hai dichiararo 'ch' come char ma e` sbagliato.
getc() ritorna un int.


 getc() ritorna un int.
Esatto, questo era l'errore :) GRAZIE!!!

 size = fseek(stream, 0, SEEK_END);
Solitamente fornisce il risultato atteso, ma lo standard non ne
garantisce il funzionamento. L'unico metodo sicuro al 100% e` contare a
mano i byte (portabile) oppure usare una funzione specifica dell'OS (non
portabile).
Luca
-- 
Home: 
http://kronoz.cjb.net
Il piu` bel momento dell'amore e` quando ci si illude che duri per 
sempre; il piu` brutto, quando ci si accorge che dura da troppo.

 Luca
Non garantisce per niente il risultato :-(  Vedi mio post precedente.
Ritorna 0 se va a buon fine e -1 se ci sono errori.  ftell() ritorna il 
valore corrente del puntatore, cioe` la dimensione.  Ed e` sicuro al 
100%.  ed e` portabile come contare i byte uno ad uno.


 Ed e` sicuro al 100%.  ed e` portabile come contare i byte uno ad uno.
No.
Luca
-- 
Home: 
http://kronoz.cjb.net
Home: 
http://kronoz.cjb.net


Chiedo scusa perche` i miei ricordi forse sono confusi, ma vuoi spiegare 
cosa vuoi dire?


 Per il resto man stat :)
Ciao
M`

 ftell() ottieni la sua dimensione. Sbaglio qualcosa?
IMHO no. Ti garantisco, visto che sto utilizzando la soluzione con fseek 
+ ftell, che funziona benissimo.
Anzi approfitto, ancora una volta per ringraziare tutti voi che siete 
intervenuti in questo 3d. Mi avete reso un gran favore :)

 cosa vuoi dire?
Forse sono stato un po' troppo sintentico, ma come ho scritto sopra lo
standard non garantisce il funzionamento di fseek con SEEK_END su uno
stream binario (anche se di solito funziona).
Luca
-- 
Home: 
http://kronoz.cjb.net
La mia opinione puo` essere cambiata, ma non il fatto che ho ragione.

 stream binario (anche se di solito funziona).
Veramente c'e' scritto (7.19.9.4) che se ftell e' chiamata su uno stream 
binario restituisce il numero di char dall'inizio del file, mentre il 
numero restituito non e' significativo nel caso di uno stream di testo, 
ma e' utilizzabile da fseek per raggiungere un determinato punto. Dice 
anche che la differenza tra due valori restituiti da ftell (credo solo 
nel caso di un file aperto in modalita' testo) non e' significativa, ma 
in questo caso non stiamo parlando di differenze.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

DevarajA ha scritto:

Non avevo letto bene il messaggio iniziale, scusa per la risposta 
affrettata, ma mi ero concentrato solo su ftell. Per quanto riguarda il 
problema di fseek tempo fa avevo letto una soluzione interessante per 
raggiungere la fine di uno stream binario, anche se non credo che fosse 
molto portabile. Se la ritrovo la posto.
