Newsgroup: it.comp.lang.c++
Titolo: Problema con un programma idiota

Ho un problema strano con un programmino facile facile.
Questo è un programma che misura la lunghezza di un file (di testo e non) e
lo stampa a video.
Il mio programma di partenza non era questo, infatti avevo in mente di
realizzare un programma che mi cancellasse le righe di testo commentate in
un file di testo.
Poi pero sono stato incuriosito da una mail sul nwsgrp in cui un signore
chiedeva come misurare la lunghezza di un file.
Ok, ora ho fatto questo programmino, che di certo no brilla per originalità.
Ecco il problema: fino a ieri funzionava perfettamente e oggi Puf!
non va più! come mai?
Vabbè, lascio a voi esperti del nwsgrp l'arduo compito di leggere i miei
sorgenti...
ciao e grazie by Tdx
#include <stdio.h>
#include <alloc.h>
int main()
{
 char path[20];
 FILE *stream;
 char c;
 int dimensione = 0;
 char *testo;
 fprintf(stdout, "Inserire il percorso e il nome del file da testare\n");
 gets(path);
 if( (fopen(path, "r+")) == NULL)
 {
  fprintf(stdout, "Errore nella apertura del file %s\n", path);
  return 1;
 }
 /*Calcolo la dimensione del file*/
 while( c != EOF )
 {
  c = getc(stream);
  dimensione++;
 }
 fprintf(stdout, "La dimensione del file %s è %d bytes\n", path,
dimensione);
 fprintf(stdout, "(%d bytes contando la fine del file)\n", dimensione+2);
 /*Alloco lo spazio necessario a contenere il file in memoria*/
 testo = (char*)malloc(dimensione);
 /*Salvo il file in una variabile e dopo lo metto a video ( puts() )*/
 fread(testo, 1, dimensione, stream);
 puts(testo);
return 0;
}

  if( (fopen(path, "r+")) == NULL)
Prova con
if( (fopen(path, "rb")) == NULL)
EMG

 puts(testo);
beh qui sbagli di nuovo... 3 volte per la precisione :P :
1) dimentichi che, per calcolare la lunghezza del file, ci sei
arrivato in fondo :PP
e quindi se vuoi di nuovo leggere il suo contenuto con fread() dovrai
spostarti nuovamente al suo inizio...
2) con fread() finisci col leggere un byte in piů di quelli che ti
servono... infatti col ciclo:
while (c!=EOF)
{
  c = getc(stream);
  dimensione++;
}
hai fatto in modo che dimensione valesse tutti i byte del file +
EOF... carattere che non ti interessa includere nella stringa... (*)
3) hai dimenticato di terminare l'array di caratteri con '\0'... (vuoi
farlo apparire come una stringa no?)
quindi ricapitolando:
fseek(stream,0,SEEK_SET); //x tornare all'inizio del file
fread(testo, sizeof(char), dimensione-1, stream); //x riempire l'array
testo[dimensione-1]='\0'; //x "terminare" la stringa..
puts(testo);
...
ora dovrebbe funzionare ;)
(*) = non era meglio una cosa del tipo:
for (;getc(stream)!=EOF;dimensione++);	?
eviteresti di usare la variabile 'char c', del tutto inutile, e
supereresti anche il problema del carattere EOF contato :)
byez

 }
Ciao By Lucio.

  int dimensione = 0;
Un'altra osservazione: se l'intero viene implementato con 2 byte dal
compilatore, il file di cui vuoi misurare la dimensione puo` essere
lungo al massimo 35535 bytes, altrimenti il numero che ottieni e`
sbagliato. Meglio usare un long, anzi un unsigned long (tanto la
dimensione e` solo positiva, no ?).
Ciao,
Gianpaolo

Tdx wrote:
Sei OT :-).
Non stai programmando in C++, ma in C.
Il newsgroup appropriato e` it.comp.lang.C.
-- 
Ing. Roberto Gerola
Email: 
robert...@penguinpowered.com
WWW: 
http://www.penguinpowered.com/~The_Cpp_Compass