Newsgroup: it.comp.lang.c
Titolo: Problema di memoria?

Ciao a tutti e grazie per l'attenzione.
Ecco il problema: questo programma apre un file di testo e se trova una riga
di testo prededuta da ; (punto e virgola), la salta. DOpodiche il progrmamma
salva il file "pulito".
Ora, il programma non funziona tanto bene, anche perchè l'ho fatto in fretta
e in furia, (don't worry, so cosa devo mettere a posto per risolvere i
piccoli problemucci che lo affliggono...) ok, allora perche mi sono rivolto
a voi? Semplice, se provo a "ripulire" file di dimensioni notevoli (700 Kb)
non mi va...(o meglio, inizia e non finisce).
Ovvio che si tratta di un problema di memoria...quello che dico io è "Ma
usando la malloc() non si dovrebbero risolvere questi problemi? ho anche
provato a usare il modello di memoria Huge (!) ma nulla da fare...
SONO NELLE VOSTRE MANI! : - )
Ciao e grazie da Tdx
#include <stdio.h>
#include <alloc.h>
int main()
{
 char path[20];
 FILE *stream;
 char c;
 unsigned long dimensione = 0;
 char *testo;
 printf("+----------------------------------------------------------+\n");
 printf("| File Clean V1.0 by Tdx 1999                |\n");
 printf("|           |\n");
 printf("+----------------------------------------------------------+\n");
 printf("Nome e percorso: ");
 gets(path);
 if( (stream = 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);
 /*Riporto il puntatore al file all'inizio del file*/
 fseek(stream, 0, SEEK_SET);
 /*Alloco lo spazio necessario a contenere il file in memoria*/
 testo = (char*)malloc(dimensione);
 c = 0;
 char d,e;
 unsigned long posizione = 0L;
 while(c!=EOF)
 {
  switch( c = getc(stream) )
  {
   case 0x3B : {  //se ce il punto e virgola.....
        do{
   d = getc(stream);
   e = getc(stream);
        } while ( (d!=0x0D) && (e!=0x0A) );
       }
   default :  {
   testo[posizione] = c;
   posizione++;
       }
  }
 }
 fwrite(testo, 1, posizione, stream);
 free(testo);
return 0;
}

 Ciao e grazie da Tdx
Non sono molto sicuro, ma secondo me l'errore concettuale e' nel fatto
che vuoi mettere tutto il file di testo in memoria : ti conviene usare
un buffer di una dimensione fissa, non troppo grande, e lavorare su
quello, cosi' hai senz'altro meno problemi.
Ciao, Luca.
-- 
 Reply to 
luca....@tiscalinet.it
 UIN : 43385135

Da dove cominciare?  Ci sono un sacco di errori.  Partendo dall'alto:
alloc.h non e' standard; gets non va adoperato mai; getc non
restituisce un cha ma un int, per cui il risultato non sara' mai EOF;
il ritorno di malloc non va mai castato, ma va incluso <stdlib>; e chi
piu' ne ha piu' ne metta, oltre non ho piu' letto.
Ma l'orrore fondamentale e' l'impostazione: perche' vuoi leggere tutto
il file in memoria?  Non ha molto senso.  L'unico motivo per cui mi
viene in mente si possa volerlo fare, e' velocizzare il processo
operando in memoria; ma... prima di leggere tutto il file in memoria
devi averlo letto gia' una volta per sapere quanto e' grande!
Senti, se il tuo problema e' line-oriented, leggi per linee.  Ecco un
esempio:
MLO@cmssun2 9 $ cat foo.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/* Copia stdin su stdout, eliminando tutte le linee che
   ; come questa
   abbiano come primo carattere non-whitespace un punto e virgola */
#define LINE_LENGTH 128
int main()
{
  char buffer[LINE_LENGTH];
 
  while (fgets(buffer, LINE_LENGTH, stdin)) {
    char *pc;
    for (pc = buffer;   isspace((int) *pc);   pc++) { }
    if (*pc == ';') continue;
    if (fputs(buffer, stdout) == EOF) {
      puts("Write error");
      return EXIT_FAILURE;
    }
  }
  return EXIT_SUCCESS;
}
MLO@cmssun2 10 $ gcc -ansi -pedantic -Wall -o foo foo.c
MLO@cmssun2 11 $ ./foo <foo.c >foo.new
MLO@cmssun2 12 $ diff -c foo.new foo.c
*** foo.new     Sun Aug 15 09:41:42 1999
--- foo.c       Sun Aug 15 09:40:46 1999
***************
*** 3,8 ****
--- 3,9 ----
  #include <ctype.h>
 
  /* Copia stdin su stdout, eliminando tutte le linee che
+    ; come questa
     abbiano come primo carattere non-whitespace un punto e virgola */
 
  #define LINE_LENGTH 128
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

 
La memoria "bassa" e' di 640k al massimo, non puoi farcene stare 700k
!!!, a parte il fatto che con il modello di memoria Huge devi usare la
farmalloc(). Se vuoi caricare tutto il file in memoria, devi gestire
quella sopra i 640k.
Scrivimi se ti serve qualche altra informazione.
Stefano