Pagina 1 di 1

testo da .txt

MessaggioInviato: 24 lug 2009, 20:15
di `knives`
allora ho varie pagine html da cui devo estrapolare tutti gli url e stamparmeli in una lista in un file nuovo.

pensavo di scrivermi 2 linee di codice per velocizzare il tutto, dato che sono all'incirca 100 url a pagina e le pagine sono una decina, solo che, oltre ad aprire il file, e leggerlo.. ho problemi nella ricerca degli url

io pensavo di sfruttare appunto la sintassi dell html e quindi ricercare nel file in successione prima
tutte le stringe all'interno dei tag "<a e /a>"
e poi ripassare la stessa eliminando esattamente i caratteri " <a href" e "/a>"

solo che questa mia idea, non la so tradurre in codice, dato che qui bazzicano vari programmatori..
idee? suggerimenti? spunti? aiuti? codice?

provero a postare qualcosa nel caso riuscissi a scriverla..

Re: testo da .txt

MessaggioInviato: 26 lug 2009, 16:18
di max10891
ciao knives..

si penso che concettualmente sia giusto...se hai pazienza appena ho un attimino PROVO a fare qualcosa...

Re: testo da .txt

MessaggioInviato: 27 lug 2009, 22:34
di `knives`
Codice: Seleziona tutto
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

void ricerca_url(FILE *, FILE *);
void prn_info(char *);
void indentazione(FILE *,FILE *);

int main(int argc, char **argv)
{

if (argc != 3){
      prn_info(argv[0]);
      exit(1);}
FILE *ifp,*ofp;

ifp= fopen(argv[1], "r");
ofp=fopen(argv[2],"w");
indentazione(ifp,ofp);
ricerca_url(ifp,ofp);
fclose(ifp);
fclose(ofp);
return 0;
}
void indentazione(FILE *ifp , FILE *ofp){
   int c;
   while((c=getc(ifp))!=EOF){
      putc(c,ofp);
      if(c == '>')
         putc('\n',ofp);
      }
   }
void ricerca_url(FILE *ifp, FILE *ofp){
   char *line;
   char *tag_in="http://";
   char *tag_out=".html";
   while(fgets(line,sizeof(line),ifp))
      {if(strstr(line,tag_in))
         fputs(line,ofp);
         }

}
void prn_info(char *pgm_name){
   printf("scemo\n");}


segmentation fault o scemo.. perchè?

Re: testo da .txt

MessaggioInviato: 28 lug 2009, 15:01
di max10891
ah c++? ok... :D

pensavo a php cisto che c'è una funzione apposta per togliere i tag...

comunque tornando alla tua funzione non capisco cosa faccia esattamente indentazione...

e poi nella fopen non va specificato se il file è di testo o è binario (quindi nelle operazioni diventa wb rb etc) o di testo? non ho mai provato a lasciaresolo r o w

Re: testo da .txt

MessaggioInviato: 28 lug 2009, 15:47
di `knives`
questo è ansi c
la procedura indentazione mi serve perchè i file source html sono scritti alla caxxo, senza "newline"
e quando poi vado a usare strstr() necessita di sapere o il numero di bit da leggere oppure di trovare un newline oppure OEF.

riguardo ai file di testo o binari r w a e via dicendo non dovrebbero appunto essere per il testo?

Re: testo da .txt

MessaggioInviato: 28 lug 2009, 23:28
di `knives`
Codice: Seleziona tutto
void ricerca_url(FILE *tmp,FILE *ofp){
   int n;
   char  line[256];
   printf("bah\n\n");
    while(getc(tmp)!=EOF){
      fgets(line,sizeof(line),tmp);
      if (strstr(line,"http:"))
         printf("%s",line);
   }

}


ma perchè non entra nel ciclio while?
sicuro cè qualcosa che non torna nei file che crea, perche nel file di testo che gli do io ci lavora senza problemi, in quello che si crea lui no..
so che in unix la gestione dei file e degli \n è diversa, ma come posso gestirli?

Re: testo da .txt

MessaggioInviato: 29 lug 2009, 11:35
di thrantir
i \n non dovrebbero inficiare niente

ma se provi ad aprire il file con un editor cosa succede?

Re: testo da .txt

MessaggioInviato: 29 lug 2009, 12:20
di `knives`
il file tmp è indentato e perfetto,
il file url invece è vuoto.

il segmentatio fault deriva dalla gestione dei file..
provero a compirlarlo sotto windows a vedere perchè il while dentro a indentazione funziona, e quello dentro a ricerca_url no.. essi che è uguale

Re: testo da .txt

MessaggioInviato: 30 lug 2009, 00:19
di max10891
ma nella ricerca il puntatore al file tmp non dovrebbe essere quello che in indentazione era chiamato ofp?

e poi ofp della ricerca essere il puntatore al file finale dove ci vanno gli url??

spero di non aver fatto confusione... (visto che non conosco ansi c...)

Re: testo da .txt

MessaggioInviato: 03 ago 2009, 16:43
di thrantir
gia', ora che mi viene in mente, non e' che devi ri-inizializzare le gli indici di scorrimento dei file?

ci posti il codice intero?

Re: testo da .txt

MessaggioInviato: 10 ago 2009, 20:42
di `knives`
Codice: Seleziona tutto
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

void ricerca_url(FILE *,FILE *);
//void prn_info(char *);
void indentazione(FILE *,FILE *);

int main(int argc, char **argv){

   /*if (argc != 3){
      prn_info(argv[0]);
      exit(1);}*/
FILE *ifp,*ofp,*tmp;
ifp= fopen("web.txt", "r+");
tmp=fopen("tmp.txt","wb+");
ofp=fopen("url.txt","wb+");
indentazione(ifp,tmp);
ricerca_url(tmp,ofp);
fclose(ifp);
fclose(tmp);
fclose(ofp);
return 0;
}
void indentazione(FILE *ifp , FILE *tmp){
   int c;
   while((c=getc(ifp))!=EOF){
      putc(c,tmp);
      if(c == '>')
         putc('\n',tmp);
      }
   }
void ricerca_url(FILE *tmp,FILE *ofp){
   int n;
   char  line[256];
   printf("bah\n\n");
    while(getc(tmp)!=EOF){
      fgets(line,sizeof(line),tmp);
      if (strstr(line,"http:"))
         printf("%s",line);
   }

}


per praticità ricerca url non scrive in un file ma sullo stdout.

Re: testo da .txt

MessaggioInviato: 11 ago 2009, 14:07
di thrantir
come immaginavo, il problema era che il "cursore" del file era gia' alla fine, il tutto si sistema facilmente con una fseek

Codice: Seleziona tutto
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <limits.h>

void ricerca_url(FILE *,FILE *);
//void prn_info(char *);
void indentazione(FILE *,FILE *);

int main(int argc, char **argv){
    FILE *ifp,*ofp,*tmp;

    //if (argc != 3){
    //  prn_info(argv[0]);
    //  exit(1);
    //}

    ifp = fopen("web.txt", "r+");
    tmp = fopen("tmp.txt","wb+");
    ofp = fopen("url.txt","wb+");

    assert(ifp != NULL);
    assert(ofp != NULL);
    assert(tmp != NULL);

    indentazione(ifp, tmp);

    ricerca_url(tmp,ofp);

    fclose(ifp);
    fclose(tmp);
    fclose(ofp);

    return 0;
}

void indentazione(FILE *ifp , FILE *tmp){
   int c;
   while((c=getc(ifp))!=EOF){
      putc(c,tmp);
      if(c == '>') {
         putc('\n',tmp);
      }
   }
}

void ricerca_url(FILE *tmp,FILE *ofp){
   int n;
   char  line[256];

   printf("ftell: %li\n\n", ftell(tmp));
   fseek(tmp, 0, SEEK_SET);
   printf("ftell: %li\n\n", ftell(tmp));

   while(getc(tmp)!=EOF) {
      fgets(line,sizeof(line),tmp);
      if(strstr(line,"http:")) {
         printf("%s",line);
      }
   }
}

Re: testo da .txt

MessaggioInviato: 11 ago 2009, 14:12
di thrantir
ftell ti dice in che posizione sta il cursore, fseek posiziona il cursore. I parametri di fseek sono:

- il FILE* relativo allo stream
- l'offset
- la posizione da cui partire, che puo' essere l'inizio (SEEK_SET), la posizione corrente (SEEK_CUR) o la fine(SEEK_END)

il cursore viene posizionato nel punto corrispondente a posizione di partenza + offset

Re: testo da .txt

MessaggioInviato: 13 ago 2009, 21:53
di `knives`
orca..lo sapevo ma non mi ricordavo piu...
eh vedi a non programmare mai.. :)

grazies!