[prog-it] Re: Mailreader, need help :-(

  • From: "z3lig" <mailmaxi@xxxxxxxxx>
  • To: <prog-it@xxxxxxxxxxxxx>
  • Date: Sun, 6 Jan 2002 16:18:35 +0100

From: "brain" <xbrain@xxxxxxxxxx>
Subject: [prog-it] Re: Mailreader, need help :-(

>.....cut......
> La riga che comincia per "From ..." costituisce il separatore tra i
> messaggi. Il problema e' ricavare, per ogni messaggio, mittente (dal campo
> From: e non dal separatore), data (va bene anche dal separatore) e
> oggetto. La difficolta' sta nel fatto che non so a priori quanto e' lunga
> la linea: se, ad esempio, leggo 100 char alla volta, potrei ritrovarmi con
> una stringa che inizia con "Subject: " ma che non contiene l'intero
> oggetto... Potrei leggere 1000 char alla volta, ma sarebbe uno spreco di
> memoria, e dato che il principale obiettivo del mailreader e' essere
> veloce, non credo che sia un vantaggio ;-)

trovare la soluzione e' piu' facile a dirsi che a farsi :-\
ho guardato i file mbox sotto linux e ho visto come dicevi tu
che una e-mail nuova inizia con la parola "From" dopo due '\n',
l'idea che mi e' venuta  e' questa (riprendendo l'idea di Andrea):
1) apri il file
2) cerchi la fine dell'email cercando la stringa "\n\nFrom" (cioe' cercando
l'inizio di
una nuova email)
3) conti i caratteri che formano questa email
4) sapendo il numero di caratteri conosci anche il numero max di token
(parole)
che puo' contenere, il caso peggiore (che non succedera' mai)
e' formato da tutte parole di un
singolo carattere separate da uno spazio, percio' avrai che la tua email
conterra' al max
numero_parole=(numero_caratteri/2)
5)ora puoi  crearti un vettore di parole grande tanto "numero_parole"
6)rileggi l'email e in ogni elemento del vettore che hai creato ci inserisci
una parola e ad ogni parola allochi tanta memoria quanta e' necessaria
contando prima i caratteri
7) una volta creato questo vettore lo puoi scandire alla ricerca dei dati
necessari....

un pezzo di codice che realizza il punto 2) e' questo:
==============================
#include<stdio.h>
#include<string.h>

int main(void)
{
 FILE *f;
 char c;
 char buf[7];
 char key[]="\n\nFrom";

 int contatore=0;
 int indice=0;


 if( (f=fopen("outbox","r"))==NULL )
  printf("\nerrore apertura file");

 for(;;)
 {
  c=fgetc(f);
  putchar(c);
  if(c=='\n')
   buf[indice++]=c;
  else if(c!='\n' && c!=' ' && indice>=2)
   buf[indice++]=c;
       else
   indice=0;
  buf[indice]='\0';
  if( (strcmp(buf, key))==0 )
   break;
  contatore++;
 }

 printf("Mail lunga %d caratteri",contatore-7);


 return 0;
}
===========================

possibili problemi:
- se dentro il corpo dell'email dovessi trovare una stringa del tipo
"\n\nFrom" tutto il discorso fatto finora non funge :-\
percio' dovresti fare anche altri controlli per sapere se un'email e'
veramente finita

- se l'email contiene allegati ti ritroveresti dei token molto grandi,forse
potresti avere problemi nell'allocare la memoria.....o forse no, boh!

Questa soluzione e' solo un'idea...tieni conto che oggi ho anche la febbre
percio' potrei anche avere delirato :-PPP

ciao :-)

z3lig





Other related posts: