Newsgroup: it.comp.lang.c
Titolo: Leggere un file di stringhe

Salve,
dovrei leggere un file di stringhe, una stringa su ogni riga, e 
memorizzare le stringhe in un array, ma a priori non so quante stringhe 
ci sono nel file. Ma anche sapendolo come faccio a dimensionare un array 
dinamico ? Con i puntatori ?  Mi date una idea da dove e come iniziare ?
Francesco
-- 
http://www.itp-news.com

 usa la classe list
Devo accedere in modo diretto alle stringhe, in base ad un numero pseudo-
casuale.
Francesco
-- 
http://www.itp-news.com


Devi creare una lista dinamica visto che non sai quante stringhe
andrai a leggere.
butto li qualcosa
typedef struct lista {
     char *str;
     struct lista *next;
} lista_t;
lista_t *lstptrhead; //usato per tenere la testa della lista
lista_t *ptrcurr;     //usato per scorrere la lista (lo usi per
puntare all'ultimo elemento inserito e poi per eventualmente stampare
la lista scorrendola)
ti indico i passi principali:
quindi apri il file in lettura
leggi la stringa e la memorizzi in un buffer
crei un elemento della lista con malloc
allochi lo spazio necessario su *str in base alla dimensione della
stringa letta e memorizzata sul buffer
copi la stringa dal buffer a str
poni next = 0;
il prossimo elemento della lista che crei lo farai puntare da next e
ripeti il tutto.

 ripeti il tutto.
Avevo la necessità di creare un array per poter accedere in maniera 
diretta ai suoi elementi, e non in maniera sequenziale come potrei fare 
con una lista concatenata.
Francesco
-- 
http://www.itp-news.com

 con una lista concatenata.
ti fai un vettore di puntatori alle stringhe.
tipo
char **stringhe;
lo dimensioni inizialmente a 1000:
stringhe= malloc(sizeof(char *)*1000);
ti tieni due valori,
uno la lunghezza fisica del vettore,
uno il numero di posizioni occupate:
int spazio=1000;
int usate = 0;
poi via via che ti arriva una stringa la copi nella
posizione libera corrente.
Se non ci sono posizioni libere allora devi
"allungare" il vettore stringhe.
Questo lo fai con la funzione realloc.
per esempio, devi aggiungere la stringa sss.
Allora:
controlli se ci sta:
if (usate==spazio)
{
   // allunghi e rellochi
   spazio += 1000;
   stringhe = realloc(stringhe, sizeof(char *) * spazio);
}
// ora hai certamente spazio:
stringhe[usate]=malloc(strlen(sss)+1);
strcpy(stringhe[usate],sss);
usate++;
naturalmente vanno aggiunti un po'
di controlli, ma l'idea di base e'
questa.
Il valore di 1000 naturalmente e'
indicativo. Il valore ideale dovrebbe
essere un compromesso tra lo spazio
sprecato (che consiglia di usare un
passo piccolo) e il tempo impiegato
nelle riallocazioni (che consiglia di usare un
passo grande).
ciao,
g.


Nessuno ti impedisce di costruire inizialmente una lista concatenata
delle stringhe allocate, e poi creare un array di puntatori a tali
stringhe.

 usa la classe list
???  qui siamo in un NG di C , non di C++. Cosa sarebbe una classe ?
Giorgio

 dinamico ? Con i puntatori ?  Mi date una idea da dove e come iniziare ?
Ma se si tratta di un vero file puoi anche contare quante righe ci sono, 
verificare quanti caratteri ha la riga più  lunga,  allocare  con questi 
valori una stringa buffer di lettura ed  un array di puntatori e quindi 
leggere le righe nel buffer,  allocare spazio in memoria e farci puntare 
gli elementi dell'  array di puntatori uno alla volta.
Giorgio

Ezechiele ha scritto:

Suggerimento (assumendo che sia un vero file).
1 Calcoli la dimensione del file (fidandoti di fseek() e ftell() o 
usando quello che il tuo SO ti mette a disposizione).
2 Allochi un buffer grande abbastanza e ci carichi tutto il file dentro 
con una fread() (ricordati di mettere '\0' alla fine!).
3 Fai un ciclo sul buffer contando il numero di righe (considerando \n o 
\r\n o \r a seconda del tuo SO).
4 Ti allochi un array di char * con abbastanza elementi
5 Un'altro ciclo sul buffer, questa volta copiando gli indirizzi 
dell'inizio delle righe nel vettore.
Fatto.
Se non vuoi scandirti il buffer due volte ti riallochi il vettore di 
puntatori man mano che ne aggiugi. Quale soluzione sia la piu' veloce 
dipende da come è fatto il file (molte righe corte o poche righe lunghe?).
Buon divertimento.
R.D.

 lunghe?).
Molte righe corte, in effetti ogni riga contiene una sola parola.
 
Francesco
-- 
http://www.itp-news.com

 Molte righe corte, in effetti ogni riga contiene una sola parola.
Allora io passerei due volte sul buffer piuttosto che fare molte
realloc().
Remo.D.