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

C' è una funzione che permette di sapere la dimensione di un file(stream)
non handle... perchè in questo caso la funzione e filelenght();
grazie per le eventuali risposte... :-}


Ho googlato è trovato questa soluzione:
ti posizioni con fseek alla fine del file e con ftell sai in che posizione
si trova il puntatore a stream... ma, questa è l' unica soluzione?? :-D

 si trova il puntatore a stream... ma, questa č l' unica soluzione?? :-D
spero molto di si che ci siano metodi migliori ... perche' facendo cosi' su
un file da 2gb forsi il SO a fare un macello per andare a scaricare la
chache file e ricaricare il finale ... e poi sapendo benissimo che
nell'apertura del file leggi gia' le informazioni di grandezza date ecc ...
sarebbe veramente uno spreco non poter avere quelle info ...
ciao


Già per questo sono abbastanza sicuro che una funzione del genere deve
esistere..... almeno credo e spero.

 esistere..... almeno credo e spero.
Chi l'ha detto che seek() implica la lettura di tutto il file?
A me non risulta che lo faccia.
Per quanto riguarda l'ottenere la dimensione senza usare fseek/ftell,
non mi risulta ci sia nulla nello standard C, mentre scendendo
in POSIX dovrebbe esserci la famiglia stat() che AFAIK puo` fare
quanto richiesto.
-- 
 Francesco Romani - Ikitt  | Describe your vision, the meaning is missing |
*** mailserver: 
freemail.it
| Won't anybody listen?                        |


In ANSI C si'.

 ANSI? <:-)
Come sai ci sono organizzazioni che "detengono" gli standard, sviluppati da
particolari comitati composti da i migliori in un dato campo (fa' eccezione
una persona che partecipa alle riunioni del comitato sul C++).
ISO e ANZI ("American NAtional Standards Institute") sono due di queste
organizzazioni.
Il termine corretto sarebbe ISO C, visto che lo standard lo "detiene" l'ISO
(non l'ANSI come avveniva prima)... questo errore non e' cosi' raro :)
POSIX e' uno standard che descrive alcune specifiche che l'interfaccia di un
sistema operativo deve avere per essere chiamato POSIX (in particolare ci
sono vari livelli, da 1 a mi pare 7 e vari sistemi operativi si conformano
a livelli diversi). Detto in parole povere, dice quali system call hai a
disposizione e come si comportano.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 si trova il puntatore a stream... ma, questa è l' unica soluzione?? :-D
Ricordati di aprire il file in modo binario o sotto alcuni sistemi operativi
che fanno differenza tra testo e dati binari avrai risultati sballati.
Le prestazioni nell'usare fseek/ftell non sono male, anche se e'
indubbiamente vero che usando la system call apposita e' possibile avere
alcune informazioni sul file in modo piu' efficiente e generalizzato
(stat() sotto sistemi POSIX).
Quello che da' fastidio usando fseek() e' che hai i limiti di questa
funzione (come ti hanno indicato), ovvero non puoi indicizzare piu' della
dimensione di un long. Proprio per ovviare a questo limite sono state
ideate 2 funzioni: fgetpos/fsetpos. Purtroppo l'offset e' un tipo opaco e
non puoi scoprire l'esatto valore.


 <:-)
ANSI = American National Standards Institute.
Tra gli standard ANSI c'e' quello per il C, che poi e' stato adottato 
anche dall'ISO (International Organization for Standardization), quindi 
ANSI C e ISO C coincidono.
ANSI C non comprende POSIX ne' altri standard, anzi e' quello piu' 
restrittivo. In compenso un programma ANSI C compila praticamente su 
qualsiasi piattaforma, mentre ad esempio POSIX solo sugli UNIX.

 ANSI C e ISO C coincidono.
E come faccio ad accorgermene se una funzione fa parte o meno dell' ANSI?
Inoltre ho un piccolo dubbio.... se creo un programma in windows... lo
compilo e faccio il link creando quindi un .exe.... in linux... mi creerà un
.rpm?????
Grazie.. ciao.

 Grazie.. ciao.
no, ti creera un eseguibile del nome che vuoi tu, gli rpm sono "pacchetti"
di installazione, non eseguibili.
Se non specifichi il nome , di default crea un a.out 
-- 
Qualsiasi
"We all know Linux is great...it does infinite loops in 5 seconds." Torvalds

 E come faccio ad accorgermene se una funzione fa parte o meno dell' ANSI?
Cercando la descrizione della libreria standard ANSI C.