Repository 32bit  Forum
Repository 64bit  Wiki

[C] File parsing [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[C] File parsing [risolto]

Messaggioda Dani » dom mag 04, 2008 23:06

Esiste una funzione per cercare determinate parole in un file, vedere se sono presenti e ottenere quindi l'offset delle stesse all'interno dello stream ?
In pratica mi servirebbe una strstr() che anzichè parsare stringhe parsi il contenuto di un testo, e che anzichè ritornare un puntatore ritorni un offset.
L'ideale sarebbe poter usare le regex su file :)

Esiste qualcosa del genere o bisogna procedere "a mano" :P ?
Ultima modifica di Dani il gio mag 08, 2008 3:35, modificato 1 volta in totale.
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: [C] File parsing

Messaggioda absinthe » lun mag 05, 2008 12:26

non credo esista... comunque potresti caricare tutto il file di testo in un buffer ed usare strstr lì!

M
Avatar utente
absinthe
Iper Master
Iper Master
 
Messaggi: 2354
Iscritto il: sab mag 14, 2005 23:00
Località: Prato
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze

Re: [C] File parsing

Messaggioda Mario Vanoni » lun mag 05, 2008 12:56

Non reinventare la ruota!

egrep -b parola file

Il codice sorgente e` GPL.

Mario Vanoni
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C] File parsing

Messaggioda Dani » mar mag 06, 2008 0:58

@Absinthe: non posso, il file è troppo grande !

@Mario: dici di prendere parte del sorgente di grep ?

A proposito di grep è davvero sorprendente, parsa un file da decine di mega in appena poco piu' di un decimo di secondo. Ma come fa !
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: [C] File parsing

Messaggioda gioco » mar mag 06, 2008 9:16

Dai un'occhiata alla libreria pcre (presente in Slackware). La usai anni fa per un progetto, implementa le espressioni regolari in C. Ora non ricordo bene l'API, ma forse trovi qualcosa di utile (magari non esattamente quello che ti serve, ma con le regex a disposizione puoi scrivere da te la funzione di cui hai bisogno). Facci sapere, può essere utile anche per altri.
Avatar utente
gioco
Packager
Packager
 
Messaggi: 900
Iscritto il: sab giu 18, 2005 23:00
Località: in the court of the Wesnoth king
Slackware: last stable

Re: [C] File parsing

Messaggioda Mario Vanoni » mar mag 06, 2008 14:11

Dani ha scritto:@Mario: dici di prendere parte del sorgente di grep ?

A proposito di grep è davvero sorprendente, parsa un file da decine di mega in appena poco piu' di un decimo di secondo. Ma come fa !


ATTENTO: parlo di egrep!

Mario Vanoni
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C] File parsing

Messaggioda Dani » mer mag 07, 2008 3:55

Sono riuscito a scrivere del brevissimo e banalissimo codice che fa al caso mio; praticamente visto che il file è troppo grande e caricandolo in ram occuperebbe troppa memoria, basta leggere riga per riga e cercare qui la parola !
Sottovalutavo fgets(), ho ottenuto il risultato sperato utilizzando sorprendentemente poche risorse.

Codice: Seleziona tutto
dani[~]$ time grep -b libQtGui.so.4.3.4 MANIFEST.TXT
11361421:-rw-r--r-- root/root      8032 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4.debug
11362492:-rwxr-xr-x root/root   7047944 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4

real    0m0.062s
user    0m0.029s
sys     0m0.021s
dani[~]$ time ./a.out MANIFEST.TXT  libQtGui.so.4.3.4
11361421:-rw-r--r-- root/root      8032 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4.debug
11362492:-rwxr-xr-x root/root   7047944 2008-02-26 22:28 opt/qt4/lib/libQtGui.so.4.3.4

real    0m0.243s
user    0m0.192s
sys     0m0.024s
dani[~]$



...molto piu' lento ma comunque sopra le mie aspettative.

@gioco: le pcre sembrano interessanti, ma che tu sappia agiscono anche su file ?

@Mario: grep ed egrep mi sembra siano la stessa cosa.
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: [C] File parsing

Messaggioda gioco » mer mag 07, 2008 9:58

Dani ha scritto:@gioco: le pcre sembrano interessanti, ma che tu sappia agiscono anche su file ?

Ho dato una rapida occhiata alle API (ricordavo poco), ma non mi sembra che lo facciano.
Nel tuo caso mi pare che le necessità fossero due: leggere efficientemente un file di grandi dimensioni e cercare un pattern in un file. Le pcre risolvono il secondo, per il primo, oltre alla soluzione da te usata, può essere utile mmap (man 2 mmap). Una volta che hai un metodo efficiente per leggere un file puoi usare le funzioni di pcre sulle stringhe.

man 1 grep ha scritto:Egrep is the same as grep -E.

man 1 grep ha scritto:-E, --extended-regexp
Interpret PATTERN as an extended regular expression (see below).
Avatar utente
gioco
Packager
Packager
 
Messaggi: 900
Iscritto il: sab giu 18, 2005 23:00
Località: in the court of the Wesnoth king
Slackware: last stable

Re: [C] File parsing [risolto]

Messaggioda Dani » gio mag 08, 2008 3:34

Peccato, mi sarebbero state utili altrimenti.
Per le regex su stringhe in genere uso le funzioni delle glibc, quindi se sono costretto a leggere riga per riga una volta che ho i dati in un buffer vanno bene queste.

Ok, risolto, grazie a tutti.
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti