PDA

View Full Version : [c]estrapolare un determinato dato da una stringa


RaouL_BennetH
18-08-2005, 16:13
In merito al 3d di mysql che ho aperto,mi accorgo però che avrei una necessità a monte:

Ovvero,fare in modo che già quando il programma mi va a scrivere sul file,filtri il risultato,ovvero:

questo è ciò che prendo dal lettore di badge:


CODICE LETTO ->0007<- ; Thu Aug 2 14:40:44 2005


vorrei quindi che mi prendesse solo:


0007 ; Thu ; Aug; 2 ; 14:40 ; 2005

/*tutti i ";" li ho messi come separatori per poi importare più facilmente in mysql con load data infile*/


Questa è la parte del programma che mi prende i dati:


fp = fopen(filename, "a+");
fprintf(fp, "%s ; %s", badge, ctime(&t));
fclose(fp);


Thx.

RaouL.

RaouL_BennetH
18-08-2005, 21:42
nessuno nessuno :(

:help:

BlueDragon
18-08-2005, 22:06
Beh, con la libreria string.h e la funzione strtok puoi dividere la stringa in base a dei delimitatori scelti e cercare quindi quello che ti serve.


CODICE LETTO ->0007<- ; Thu Aug 2 14:40:44 2005
La dividi prima in due parti sul ;.
La seconda parte è tutta delimitata da spazi.
La prima parte basta che delimiti sui - per trovare il numero che c'è in mezzo.

(puoi vedere l'uso di strtok su http://www.cplusplus.com/ref/ )

EDIT: Come non detto, non basta delimitare la prima parte su -...avevo guardato male..cmq il concetto è lo stesso...:)

RaouL_BennetH
18-08-2005, 22:33
Beh, con la libreria string.h e la funzione strtok puoi dividere la stringa in base a dei delimitatori scelti e cercare quindi quello che ti serve.


CODICE LETTO ->0007<- ; Thu Aug 2 14:40:44 2005
La dividi prima in due parti sul ;.
La seconda parte è tutta delimitata da spazi.
La prima parte basta che delimiti sui - per trovare il numero che c'è in mezzo.

(puoi vedere l'uso di strtok su http://www.cplusplus.com/ref/ )

EDIT: Come non detto, non basta delimitare la prima parte su -...avevo guardato male..cmq il concetto è lo stesso...:)

grazie per la dritta :)

allora ho provato a fare così giusto per capirne il concetto:


#include <stdio.h>
#include <string.h>

int main ()
{
FILE *fp;
char filename[] = "prova.txt";
char str[] ="CODICE LETTO ->0001<-";
char *newstr;
newstr = strtok (str,">");

while (newstr != NULL)
{
newstr = strtok (NULL, "-<- ,.");
fp = fopen(filename, "a+");
fprintf (fp,"%s\n",newstr);
fclose(fp);
}
return 0;
}


però,nel file di testo poi mi scrive questo:


0001
(null)


quel "(null)" da dove viene fuori? :what:

RaouL_BennetH
18-08-2005, 22:57
0001
(null)


quel "(null)" da dove viene fuori? :what:

ho capito che quel "null" altro non è che appunto il puntatore:

char *newstr;

bene :D
anzi,male :(
adesso che lo so,comunque non so come non stamparlo :help:

BlueDragon
18-08-2005, 22:57
Seguiamo il flusso:

char str[] ="CODICE LETTO ->0001<-";
char *newstr;
newstr = strtok (str,">"); [Ora il token puntato è "CODICE LETTO -"]

While (newstr != NULL) [è diverso da null, procediamo]
newstr = strtok (NULL, "-<- ,."); [ora il token puntato è 0001]
fprintf (fp,"%s\n",newstr); [scritto 0001 su file]

While (newstr != NULL) [è diverso da null, procediamo]
newstr = strtok (NULL, "-<- ,."); [rimane nella stringa -, che è delimitatore quindi nullificato..]
fprintf (fp,"%s\n",newstr); [stampiamo null]

While (newstr != NULL) [null, usciamo...]

E' giusto quindi quello che scrive ;)

Per trovare 0001:
char str[] ="CODICE LETTO ->0001<-";
char *newstr;
newstr = strtok (str,">");
newstr = strtok (null, "<");
printf ("Ecco quello che cercavo %s", str);

RaouL_BennetH
18-08-2005, 23:01
Seguiamo il flusso:

char str[] ="CODICE LETTO ->0001<-";
char *newstr;
newstr = strtok (str,">"); [Ora il token puntato è "CODICE LETTO -"]

While (newstr != NULL) [è diverso da null, procediamo]
newstr = strtok (NULL, "-<- ,."); [ora il token puntato è 0001]
fprintf (fp,"%s\n",newstr); [scritto 0001 su file]

While (newstr != NULL) [è diverso da null, procediamo]
newstr = strtok (NULL, "-<- ,."); [rimane nella stringa -, che è delimitatore quindi nullificato..]
fprintf (fp,"%s\n",newstr); [stampiamo null]

While (newstr != NULL) [null, usciamo...]

E' giusto quindi quello che scrive ;)

Per trovare 0001:
char str[] ="CODICE LETTO ->0001<-";
char *newstr;
newstr = strtok (str,">");
newstr = strtok (null, "<");
printf ("Ecco quello che cercavo %s", str);


non ci sono ancora :( abbi un pò di pazienza :ave:

seguendo il tuo ultimo suggerimento,mi stampa questo nel file:


0001
-
(null)

BlueDragon
18-08-2005, 23:10
non ci sono ancora :( abbi un pò di pazienza :ave:

seguendo il tuo ultimo suggerimento,mi stampa questo nel file:


0001
-
(null)

Il mio ultimo suggerimento era *solo* quel codice da solo, da stampare a video (printf) :)
Se poi vuoi stamparlo su file, metti anche l'apertura del file e la fprintf...ma senza il ciclo while :)

Cioé, per essere chiari:

#include <stdio.h>
#include <string.h>

int main ()
{
FILE *fp;
char filename[] = "prova.txt";
char str[] ="CODICE LETTO ->0001<-";
char *newstr;
newstr = strtok (str,">");
newstr = strtok (null, "<");
printf ("Ecco quello che cercavo %s\n", str);
fp = fopen(filename, "a+");
fprintf (fp,"%s\n",newstr);
fclose(fp);
return 0;
}

BlueDragon
18-08-2005, 23:16
Ok, ho ritirato fuori il compilatore C tanto per essere sicuro, e ci sono due bachetti in quello che ho scritto.
null va scritto maiuscolo :)
ed ho scritto str nella printf anziché newstr ;)

RaouL_BennetH
18-08-2005, 23:18
:doh:

E dire che l'avevo anche fatto senza il ciclo (avevo intuito che non fosse necessario) ma mi bloccavo perchè avevo un errore in compilazione,dato che scrivevo:

newstr = strtok(null, "<");

anzichè

newstr = strtok(NULL, "<");

:D

grazie infinite per stasera,anche per il suggerimento nell'altro mio post!
Ora ho bisogno di riflettere un pò su queste nuove cose imparate grazie a te :)

Non sparire e grazie mille per adesso (tanto domani torno a romperti le scatole!!!)

RaouL_BennetH
20-08-2005, 14:58
BlueDragon oltre a non finire mai di ringraziarti,ringrazio di cuore anche DanieleC88 che mi ha indicato la funzione strftime che mi risolve il problema della formattazione della data in C,in modo che su mysql vado poi a scrivere il dato direttamente in maniera corretta!

Ringraziare tutti quelli che mi stanno dando una mano in questo mio piccolo progettino richiederebbe troppo tempo,e non sarebbe nemmeno corretto per chi non menzionerei perchè magari in quel momento l'ho dimenticato!

Grazie allora a tutti!

RaouL.

P.S::guardate che non è mica finita !! :D

DanieleC88
20-08-2005, 16:08
BlueDragon oltre a non finire mai di ringraziarti,ringrazio di cuore anche DanieleC88 che mi ha indicato la funzione strftime che mi risolve il problema della formattazione della data in C
Ci siamo per questo! ;)

RaouL_BennetH
21-08-2005, 17:45
:doh:

Nell'entusiasmo poi non ho riportato la soluzione,che consisteva nell'utilizzo della funzione strftime,casomai possa essere utile anche ad altri:


#include <stdio.h>
#include <time.h>

int main()
{

/*codice vario bla bla bla*/

FILE *fp;
char filename[] = "file.txt";
char mio_dato[50];
char data_formattata[60];
struct tm *ptr;
time_t t;
ptr = localtime(&t)

/*altro codice vario bla bla bla*/
stfrtime(data_formattata,100, "%tipo_%di_%formato_%voluto",ptr);
fprintf(fp, "%s ; %s\n", mio_dato, data_formattata);
fclose(fp);


Volendo poi si può anche usare malloc per allocare al volo lo spazio necessario per mia_data:


char *data_da_formattare = malloc(100);

/*e dopo però non dimenticarsi di deallocarla con: */
free(data_da_formattare);


Ovvio che ottimizzazioni e/o altri suggerimenti e consigli sono più che ben accetti :)

RaouL.

Fenomeno85
21-08-2005, 18:40
avevo postato in un topic di daniele il codice :D basta trovarlo :D

~§~ Sempre E Solo Lei ~§~

RaouL_BennetH
22-08-2005, 00:51
avevo postato in un topic di daniele il codice :D basta trovarlo :D

~§~ Sempre E Solo Lei ~§~

Il codice per cosa? :what:

:D

P.S.: sei sempre il mio fenomeno preferito!! :winner:

DanieleC88
22-08-2005, 08:45
avevo postato in un topic di daniele il codice :D basta trovarlo :D

~§~ Sempre E Solo Lei ~§~
Che codice? Che topic? :confused:

Fenomeno85
22-08-2005, 09:02
Che codice? Che topic? :confused:

chi se lo ricorda :D ... era per la data :D

~§~ Sempre E Solo Lei ~§~

cdimauro
22-08-2005, 10:10
Volendo poi si può anche usare malloc per allocare al volo lo spazio necessario per mia_data:

Ovvio che ottimizzazioni e/o altri suggerimenti e consigli sono più che ben accetti :)

RaouL.
Allora non usare la malloc in questo caso... :p

DanieleC88
22-08-2005, 13:02
Allora non usare la malloc in questo caso... :p
E perché no? :)

Fenomeno85
22-08-2005, 13:19
E perché no? :)

ma perchè allocare in modo statico non richiede tempo :) penso sia per questo motivo che ha detto quella frase


~§~ Sempre E Solo Lei ~§~

DanieleC88
22-08-2005, 13:52
ma perchè allocare in modo statico non richiede tempo :) penso sia per questo motivo che ha detto quella frase


~§~ Sempre E Solo Lei ~§~
Non credo che la suprema velocità di esecuzione sia una delle priorità di Raoul per questo programma... :)

Fenomeno85
22-08-2005, 14:04
Non credo che la suprema velocità di esecuzione sia una delle priorità di Raoul per questo programma... :)

... che te devo di?? :D ... interpreto in quel modo quella risposta :D

~§~ Sempre E Solo Lei ~§~

RaouL_BennetH
22-08-2005, 16:43
... che te devo di?? :D ... interpreto in quel modo quella risposta :D

~§~ Sempre E Solo Lei ~§~

dando anche io un'interpretazione,scusandomi in anticipo se errata perchè come sapete sono abbastanza nuovo in questo campo,credo che cdimauro si riferisca al momento in cui il compilatore compila il codice.Con malloc credo di intuire che il compilatore non ottimizzi a priori qualche cosa. Il "cosa" poi,ho ancora da capirlo :D

cdimauro
23-08-2005, 08:25
E perché no? :)
Raoul aveva chiesto consigli per delle ottimizzazioni, da cui è seguita la mia risposta. ;)

In generale se conosci già a priori la dimensioni dei vettori è meglio dichiararli direttamente anziché utilizzare i puntatori e usare la malloc.

La malloc, per bene che vada, è comunque una chiamata a una routine; può ritornare abbastanza velocemente se c'è un gestore di memoria "interno" (chiamato "heap" in gergo), ma nel caso peggiore si trasforma in una system call, per cui puoi immaginare...
Stesso discorso per la free.

Inoltre il fatto che allochi memoria ti obbliga poi a doverla liberare, e nel caso ci si dimentichi saltano fuori i famigerati "memory leak", che sono uno degli incubi dei programmatori (tante volte è difficile scoprirli).

Questo non vuol dire che, nota la dimensione di un vettore, lo si debba sempre dichiarare: può capitare di dover usare diverse strutture di elevate dimensioni, e quindi la loro dichiarazione comporterebbe un notevole consumo di risorse, anche se poi non si usano tutte assieme.
In questo caso è compito del programmatore valutare quali strutture sono usate "sempre", e quali si possono allocare quando servono (e poi liberare :D).

DanieleC88
23-08-2005, 13:17
Capisco. :)

Fenomeno85
23-08-2005, 13:18
ci avevo azzeccato ho vinto qualche cosa? :D

~§~ Sempre E Solo Lei ~§~

cdimauro
24-08-2005, 08:29
L'elefante o la farfalla, ma ti sconsiglio il primo... :D

Fenomeno85
24-08-2005, 09:13
L'elefante o la farfalla, ma ti sconsiglio il primo... :D

farfalla :oink:

~§~ Sempre E Solo Lei ~§~