Newsgroup: it.comp.lang.c
Titolo: Funzione che non funziona!!!!

Salve, qualche anima pia č in grado di darmi lumi sul fatto che con
qualsiasi file la funzione sottoelencata mi restituisce il valore -7744?
L'ho messa in una funzione tanto per capirci qualcosa, ma la stessa cosa mi
accade se uso la filelength anche in una qualsiasi linea su qualsiasi file
aperto.
E' il solito problema dei neofiti con i puntatori?
long  LenFile( char NomeFile[]){
   int fh, result;
   long fsize;
   if( (fh = _open( NomeFile, _O_RDONLY))  != -1 )
   {
    fsize = _filelength( fh );
   _close( fh );
   return fsize;
   }
   else
    return 0;
}
--
Live Long And Prosper
Emanuele Manco

 valore -7744?
  Usi funzioni non standard, per cui non ti posso dare una risposta. Se
vuoi conoscere la lunghezza del file, aprilo con le funzioni standard e
poi usa fseek per spostarti sull'ultimo carattere ed ftell per sapere
l'offset di questo.
<code>
	#include <stdio.h>
	int main()
	{
		FILE *fl;
		fl=fopen("myfile","r");
		fseek(fl,0,SEEK_END);
		printf("Il file e` lungo %ld\n",ftell(fl));
		close(fl);
		return 0;
	}
</code>
	Alla prossima,
		Marco

Ecco come ho aggiustato la mia funzione:
long  APIENTRY LenFile( char NomeFile[]){
 FILE *fl;
 long fsize;
 fl=fopen(NomeFile,"r");
  fseek(fl,0,SEEK_END);
   fsize = ftell(fl);
 fclose(fl);
 return fsize;
}
Il risultato č identico!! Grazie lo stesso.
Ho scoperto che esiste una funzione che se non ho capito male č di libreria,
ossia la filelength () ma da ancora lo stesso risultato!!!
Mah... Stavolta parliamo di C puro e semplice...
Emanuele Manco

 writes:

Forse e' quello stranissimo APIENTRY che non ho mai visto prima; ma a
me funziona tutto perfettamente.  Forse sei in un ambiente operativo
intrinsecamente bacato?
MLO@pcdf0 26 $ ls -l file.txt
-rw-r--r--   1 loreti   g1cdf          17 Jun 15 13:21 file.txt
MLO@pcdf0 27 $ cat quux.c
#include <stdio.h>
int main() {
  FILE *fl = fopen("file.txt", "r");
  if (fl) {
    fseek(fl, 0, SEEK_END);
    printf("%ld\n", ftell(fl));
    fclose(fl);
  }
  return 0;
}
MLO@pcdf0 28 $ gcc -ansi -pedantic -Wall -o quux quux.c
MLO@pcdf0 29 $ ./quux
17
MLO@pcdf0 30 $ 
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

 intrinsecamente bacato?
APIENTRY è un suffisso che indica che la funzione fa parte di una DLL
(orrore) Windows.
Avrei dovuto levarla dal cut e paste. Mettiamola così...
Con il VC++ 6.0 questa funzione non da il risultato sperato.
Probabilmente hai ragione tu, e sarò costretto ad usare le API di windows.
L'approccio dello C puro che bypassa il Winzozz e si rivolge direttamente al
BIOS forse dà problemi...
Emanuele Manco

 e si rivolge direttamente al BIOS forse dà problemi...
  Non direi, il seguente programma, compilato con il Borland C/C++ su un
host Windows 95, funziona normalmente.
<code>
	/* len.c */
	#include <stdio.h>
	int main()
	{
		FILE *fl;
		fl=fopen("len.c","r");
		fseek(fl,0,SEEK_END);
		printf("Il file e` lungo %ld\n",ftell(fl));
		fclose(fl);
		return 0;
	}
</code>
  Il problema tuo, credo, e` nel fatto che la funzione da te definita e`
all'interno di una DLL. Controlla bene come vanno definite le funzioni
in questo caso, magari chiedendo in qualche gruppo dedicato: non sono
sicuro che APIENTRY copra tutte le tue necessita`.
	Alla prossima,
		Marco