/* questo programma legge da un file le parole, memorizza quelle contenenti
* una determinata lettera e le scrive su un secondo file. Il tutto e'
* stato fatto cercando di risparmiare la memoria utilizzata. Come al
* solito questo NON e' un buon esempio di programmazione! infatti il
* programma NON e' adeguatamente commentato */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include"util.h"
#define FILE_IN "sample.txt"
#define FILE_OUT "out.txt"
#define LETTER 'r'
#define BUFFERLEN 5
char *leggi_parola(FILE *);
void inserisci_parola_in_lista(char *);
void inserisci_lista_parole_in_file(char **, FILE*);
void libera_array(char **);
/* array di array (*listaparole[]) */
static char **listaparole;
/******************************************************************************/
int main(int argc, char **argv)
{
FILE *testo, *parole_trovate;
char *parola_in_esame;
/* apro i due file */
testo=Fopen(FILE_IN, "r");
parole_trovate=Fopen(FILE_OUT, "w");
listaparole=NULL;
while (1)
{
if(!(parola_in_esame=leggi_parola(testo)))
break;
/* se contiene la lettera di interesse la inserisco */
if(strchr(parola_in_esame, LETTER))
inserisci_parola_in_lista(parola_in_esame);
}
fclose(testo);
inserisci_lista_parole_in_file(listaparole, parole_trovate);
fclose(parole_trovate);
/* libero memoria allocata dinamicamente */
libera_array(listaparole);
return 0;
}
/******************************************************************************/
void inserisci_lista_parole_in_file(char **a, FILE* out)
{
for(; *a; ++a)
fprintf(out, "%s\n", *a);
}
/******************************************************************************/
char *leggi_parola(FILE *mio_file)
{
char c=' ';
char *parola=NULL;
int lenparola=1;
int nbuff=1;
while((!feof(mio_file))&&(!isalpha((int)c)))
c=fgetc(mio_file);
if(feof(mio_file))return NULL;
/* alloco un primo buffer */
parola=Malloc(sizeof(char)*BUFFERLEN*nbuff+sizeof(char));
/* ci metto il valore letto */
*parola=c;
/* man mano leggo altri caratteri */
while((!feof(mio_file))&&(isalpha((int)(c=fgetc(mio_file)))))
{
if(lenparola>(BUFFERLEN*nbuff))
parola=Realloc(parola, sizeof(char)*BUFFERLEN*++nbuff+sizeof(char));
parola[lenparola++]=c;
}
/* chiudo la stringa */
parola[lenparola]='\0';
return parola;
}
/******************************************************************************/
void inserisci_parola_in_lista(char *parola_da_inserire)
{
static int n_parole=1;
if(listaparole==NULL)
{
listaparole=Malloc(sizeof(char**)*2);
listaparole[0]=parola_da_inserire;
listaparole[1]=NULL;
}
else
{
listaparole=Realloc(listaparole, sizeof(char*)*(n_parole+2));
*(listaparole+n_parole)=parola_da_inserire;
n_parole++;
*(listaparole+n_parole)=NULL;
}
}
/******************************************************************************/
void libera_array(char **a){
for(; *a; ++a)
free(*a);
}