Newsgroup: it.comp.lang.c++
Titolo: Lunghezza in byte di un file

Salve a tutti! Come potrei fare per conoscere la lunghezza in byte (o
meglio,in char) di un file senza contarli uno per uno?
Grazie

 meglio,in char) di un file senza contarli uno per uno?
non puoi farlo in c++ standard: dipende dal sistema operativo che usi
chiedi sul NG adatto

 meglio,in char) di un file senza contarli uno per uno?
Se il tuo linguaggio/compilatore supporta
le istruzioni fseek e ftell, allora il sistema piu' semplice
che io conosco e'
#include<stdio.h>
int FLen(char *s)
{
   FILE *f;
   f=fopen(s,"rb");
   if (!f) return LI_MORTACCI_TUA;
   fseek(f,0,SEEK_END);
   int L=ftell(f);
   fclose(f);
   return L;
}
col il mio gcc/g++ funziona (attenzione ai files piu'
lunghi di 2 GB pero'...). Su altri sistemi potresti
dover cercare funzioni corrispondenti, magari non
su FILE ma su stream vari. Non sempre esiste
una singola funzione per fare quello che vuoi.
ciao,
g.



ehm...
unsigned long filelen(ifstream & f){
	unsigned long count=0;
 
	while(1){
		f.ignore(BUFLEN);
		if (f.gcount() != BUFLEN)
			break;
		count+=BUFLEN;
	}
	count+=f.gcount();
	f.seekg(0);
	return count;
}
Questo non č standard???
il problema č che cercavo qualcosa di piů veloce, sempre in standard
C++...un algoritmo migliore,visto che questo l'ho semplicemente tradotto
da una funzione in standard C che feci 4-5 anni fa...
Se avessi avuto intenzione di dipendere dai sistemi avrei chiesto su
altri NG, ho chiesto qui perchč mi serve qualche modo in C++ standard e
non credo che la mia soluzione sia la migliore...consigli?
(tra l'altro in UNIX esiste fstat() che č POSIX, ed esiste anche in molte
implementazioni C/C++ per altri sistemi, ma non č questo che volevo...)
Grazie a tutti,cmq!

 }
Giusto,mi frullava qualcosa in mente ma non riuscivo a
inquadrarla...andare alla fine del file ok,ma poi come sapere la
posizione? semplice,ftell!:-)...e in C++?Vabbč,basta rompere sul NG,me la
cerco io. L'unica cosa...č abbastanza veloce secondo voi?piů veloce che
contare i blocchi manualmente?
Grazie

 Questo non è standard???
si, ma hai detto "senza contarli". quello che fai e' scorrere il file 
fino alla fine.

 che contare i blocchi manualmente?
puoi provare 
#include <fstream>
int FileLen(char* s){
  std::ifstream input(s, ios_base::ate);
  if (input) 
    return (int) input.tellg();
  else 
    return 0;
}
ma gli stream sono oggetti pesanti, ti consiglio se puoi di pasarne uno 
gia' vivo come reference, tipo:
int FileLen(std::ifstream& input, char* s){
  input.open(s, ios_base::ate);
  if (input) 
    return (int) input.tellg();
  else 
    return 0;
}

 che contare i blocchi manualmente?
puoi provare 
#include <fstream>
int FileLen(char* s){
  std::ifstream input(s, ios_base::ate);
  if (input) 
    return (int) input.tellg();
  else 
    return 0;
}
ma gli stream sono oggetti pesanti, ti consiglio se puoi di pasarne uno 
gia' vivo come reference, tipo:
int FileLen(std::ifstream& input, char* s){
  input.open(s, ios_base::ate);
  if (input) 
    return (int) input.tellg();
  else 
    return 0;
}
e comunque non e' garantino che questo non conti i byte uno alla volta, 
magari pero' usa un buffer ed e' piu' veloce che farlo da te.

 fino alla fine.
 
si,ma č molto piů veloce cosě che uno a uno,almeno sul mio sistema. E
cmq, cercavo qualcosa tipo quello che poi mi hanno consigliato: andare
alla fine del file con un seek e leggere la posizione...questo
E'standard,vero?



se ti basta restare nello standard posix uscendo dall'ansi..
man fstat
man stat
ciao 
 sbirish

  sbirish
 
Leggi l'altro post,conosco le funzioni platform-dependent,tra l'altro
fstat è presente praticamente su tutte le piattaforme che possano usare
il compilatore GNU,ovvero praticamente il 90% delle piattaforme. Ma ho
bisogno di un algoritmo standard, C++ puro.
Grazie lo stesso