Newsgroup: it.comp.lang.c
Titolo: file di testo e array di puntatori.

Salve,
quello che dovrei fare è visualizzare un file di testo dato in input. E fino
qui non c sono problemi.
Ma devo farlo costruendo un array di puntatori dove ogni puntatore punta ad
una riga del file di testo. come faccio? Qualsiasi aiuto è ben accetto.
REmo

remo wrote:

Visto che i bravi non ti hanno risposto, ti rispondo io. :-)
Se non ho capito male, vuoi leggerti un file, tenertelo tutto in memoria,
e avere dei puntatori alle "righe" del file di testo.
La soluzione piu' semplice che mi viene in mente e' quella di allocarti
un blocco di memoria grande come tutto il flie, leggi il file e lo metti
nel blocco di memoria precedentemente allocato, cerchi i '\n' e memorizzi
la posizione in un array di puntatori a char.
tipo
<CODE>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[], char** envP)
{
   unsigned long int idx     = 0;
   unsigned long int fileDim = 0;
   FILE*  fileP     = NULL;
   char*  tmpPtrP   = NULL;
   char*  fileBuffP = NULL;
   char** rowPtrPP  = NULL;
   if(1 < argc)
      fileP = fopen(argv[1], "rt");
   if(NULL != fileP)
   {
     fseek(fileP, 0, SEEK_END);
     fileDim = ftell(fileP);
     rewind(fileP);
     if(0< fileDim)
        fileBuffP = calloc(1, fileDim);
     if(NULL != fileBuffP)
     {
        fread(fileBuffP, fileDim, 1, fileP);
     // Non sapendo quante righe ci sono nel file
     // suppongo che ogni riga sia di 60 caratteri
     // se non basta lo spazio allocato si ridimensiona
     // il tutto.
     // -----------------------------------------------
        rowPtrPP = calloc(fileDim/60 +1, sizeof(char*));
        if(NULL != rowPtrPP)
        {
           rowPtrPP[0] = fileBuffP;
           idx = 0;
           while(NULL != (tmpPtrP = strchr(rowPtrPP[idx], '\n')))
           {
              *tmpPtrP = '\0';
              idx++;
              rowPtrPP[idx] = tmpPtrP+1;
           }
        }
     }
   }
  return 0;
}
</CODE>
ATTENZIONE!!!! Non sognarti di usare il codice cosi' com'e'. Bisogna
aggiungerci uno o due quintali di controlli, altrimenti fa Boooom.
Garantito. Credo comunque che come proseguire sia chiaro. :-)
HTH
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 del 16:54, sabato 
7 settembre 2002, remo (
rem...@libero.it
) scrisse:

Ho preparato una soluzione moolto tempo fa, ma posso connettermi una sola 
volta alla settimana (o anche ad intervalli maggiori), per cui te la mando 
adesso.
#include <stdio.h>
#include <stdlib.h>
#define LINELEN 61
#define MAXPATH 81
#define LINESIZE sizeof(char)*LINELEN
void free_mem(void **, int);
int main()
{
        char **linee=NULL, **p=NULL;
        FILE *file=NULL;
        int count;
        {
                char path[MAXPATH];     /*Essendo un array voluminoso
                                        *e necessario in un solo punto
                                        *del programma, facciamo in
                                        *modo che venga automaticamente
                                        *distrutto quando ha cessato di servirci
                                        */
                fputs("FIle da leggere: ", stderr);
                scanf("%80s", path);
                if(!(file=fopen(path, "r"))){
                        fprintf(stderr, "Impossibile accedere al file %s ", path);
                        return 1;
                }
        }
        for(count=0; !feof(file); ++count){
                if(!(p=realloc(linee, sizeof(char*)*(count+1))))
                        goto err;
                linee=p;
                if(!(*(p+count)=malloc(LINESIZE))){
err:
                        fputs("Memoria esaurita", stderr);
                        free_mem(linee, count);
                        return 2;
                }
                fgets(*(linee+count), LINELEN, file);
        }
        for(p=linee; p<linee+count-1; ++p)
                printf("%s", *p);
        free_mem(linee, count);
        fclose(file);
        return 0;
}
void free_mem(void **p, int i)
{
        while(i){
                free(*(p+i));
                --i;
        }
        if(p)   free(p);
}
-- 
Per l'e-mail rimouvere gli underscore e la frase in maiuscole.

         free_mem(linee, count);
O metti count-1, o Boom!
