|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
[C] Leggere File Strutturati
raga c'è un modo facile ed abbastanza rapido per leggere delle informazioni da un file "strutturato"?
Nel senso che ho un file di questo tipo, più o meno: Codice:
<nomeCategoria> <nomeCategoriaPadre> >numeroProprietàSpecificheDellaCategoria> <Proprieta_1> …<Proprieta_N> ... ... <nomeCategoria> <nomeCategoriaPadre> >numeroProprietàSpecificheDellaCategoria> <Proprieta_1> …<Proprieta_N> mi date info su come leggere efficientemente da file una cosa del genere?
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se all'interno di ogni campo non devi avere lo spazio, puoi usare lo spazio come delimitatore per la strtok, altrimenti devi usare o un altro separatore oppure proprio un altro metodo per la separazione dei campi.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
ok...ma se non so quanto è lunga la mia riga?
può tanto essere 10 caratteri quanto 100.....come si fa? c'è una funzione che legge in automatico l'intera riga?
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Si può fare ad esempio: Codice:
#define MAXBUFLEN 1024
...
char buffer[MAXBUFLEN];
...
while (fgets (buffer, MAXBUFLEN, f) != NULL)
{
...elabora riga...
}
Codice:
String line = br.readLine ();
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Quote:
mi sembra utilissima! dimmi che è standard e sarò un uomo felice!
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2002
Città: Italy/Usa
Messaggi: 2817
|
Quote:
è considerata `unsafe` per applicazioni multi-thread, dove è preferibile utilizzare la `strtok_r`
__________________
"Utilizzando atomi pentavalenti drogheremo il silicio di tipo n; Utilizzando atomi trivalenti drogheremo il silicio di tipo p; Utilizzando della cannabis ci drogheremo noi e vedremo il silicio fare cose impossibili" - DSDT-HowTo |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Quote:
cavolo... da oggi sono un uomo nuovo!
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
bella la strtok, adesso faccio qualche prova e forse avrò finto di cilare per cercare gli spazi.
__________________
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Prendiamo questo codice: Codice:
char string[] = ";aa;;bb;cc;", *p, *s;
s = string;
while ((p = strtok (s, ";")) != NULL)
{
printf ("[%s]\n", p);
s = NULL;
}
Codice:
[aa] [bb] [cc] Codice:
typedef struct
{
char *ptr;
char *delim;
} GET_TOKEN;
void get_token_init (GET_TOKEN *gt, char *string, char *delim)
{
gt->ptr = string;
gt->delim = delim;
}
char *get_token_next (GET_TOKEN *gt, char *delim)
{
char *str;
if (delim == NULL)
delim = gt->delim;
while (*gt->ptr != '\0' && strchr (delim, *gt->ptr) != NULL)
gt->ptr++;
if (*gt->ptr == '\0')
return NULL;
str = gt->ptr;
while (*gt->ptr != '\0' && strchr (delim, *gt->ptr) == NULL)
gt->ptr++;
if (*gt->ptr != '\0')
{
*gt->ptr = '\0';
gt->ptr++;
}
return str;
}
/*-----------------------------*/
char string[] = ";aa;;bb;cc;", *p;
GET_TOKEN gt;
get_token_init (>, string, ";");
while ((p = get_token_next (>, NULL)) != NULL)
printf ("[%s]\n", p);
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
grazie, adesso provo...
cmq x il momento nn sto lavorando con stringhe, terrò presente x il futuro. ciao
__________________
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Quote:
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Innanzitutto strtok_r è disponibile solo su Linux. Su Windows (almeno sul VC++) non esiste ma esiste solo la strtok, che però è (fortunatamente) thread-safe. Ma lasciamo perdere un momento la questione del thread-safe o non thread-safe. Il problema principale della strtok è che usa delle sue variabili globali e questo impedisce il suo utilizzo in modo "parallelo" anche all'interno dello stesso thread! Esempio di codice: Codice:
#include <stdio.h>
#include <string.h>
void print_subtokens (char *str)
{
char *p, *s;
s = str;
/* !!!!!!!! BANG, CREA CASINI !!!!!!!! */
while ((p = strtok (s, "-")) != NULL)
{
printf ("[%s]\n", p);
s = NULL;
}
}
int main ()
{
char string[] = ";a-a;;b-b;c-c;", *p, *s;
s = string;
while ((p = strtok (s, ";")) != NULL)
{
print_subtokens (p);
s = NULL;
}
return 0;
}
Con le funzioni get_token_xxx che ho buttato giù io, questo non succederebbe, perché lo stato della funzione è memorizzato in una struttura GET_TOKEN e ne puoi avere quante ne vuoi!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 05-01-2006 alle 16:15. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8897
|
scusate ma o ho capito male il problema o non capisco proprio l'utilizzo di strtok ... se lui sa com'è la struttura
quindi struct ciao_mamma { char nome_categoria [n]; char nome_categoria_padre[n]; int num; ... }; basta che usi un fread e sei a posto ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Quote:
... però se nella tua funzione print_subtokens() avessi usato due char con nomi diversi da quelli del main(), si sarebbe presentato lo stesso problema? se si... non ho capito se no... grazie mille per tutte le delucidazioni!
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Il problema. purtroppo, è interno alla strtok. La prima volta che chiami la strtok, gli passi nel primo parametro il puntatore all'inizio della stringa da esaminare. Nelle successive chiamate alla strtok, passi un NULL nel primo parametro e la strtok continua ad operare sulla stessa stringa perché si è tenuta "da qualche parte" delle informazioni sulla stringa, in pratica si "ricorda", per dirlo in modo semplice, dove è arrivata. Ma questa informazione è globale, quindi ce n'è soltanto una (per il singolo thread).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jun 2004
Messaggi: 760
|
Quote:
grazie
__________________
Gandalf_BD -------------------------------------------- "When you aim at perfection, you discover it's a moving target" |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Raga vi spiego bene il mio problema...devo scrivere un programma che sia in grado di generare un albero di tassonomia...mi spiego meglio, anzi vi do proprio il testo del mio esercizio così ci capiamo perfettamene!
Il mio problema è che devo fare questo esercizio in C e conosco ancora molto poco questo linguaggio quindi sto incontrando difficoltà....ed una di queste è la lettura da file... Dovrei fare una prima bozza entro l'8 di questo mese (ed ho scoperto solo l'altro giorno di sto esercizio da fare...) quindi chiedo il vostro immenso aiuto con dei suggerimenti, su come proseguire... Io avevo pensato ad un "Alberto Radicato" per contenere l'albero della tassonomia (di qui avete un immagine nel file allegato) e questo albero avrà una struttura del tipo: Codice:
-------------------------- | PADRE | -------------------------- | FIGLIO | FRATELLO | -------------------------- Codice:
Struttura AlberoRadicato
Padre (stringa)
Figlio (puntatore a "Struttura AlberoRadicato")
Fratello (puntatore a "Struttura AlberoRadicato")
Fine Struttura
credo che sia la struttura ad albero migliore per rappresentare il mio problema in quanto non pone limiti iniziali sul numero dei vari sotto-nodi, ovviamente per indicare che non ci sono più fratelli di un determinato nodo basta usare un carattere speciale identificato come terminatore... che ne pensate? è ok?
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC Ultima modifica di leadergl : 06-01-2006 alle 11:09. |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Voglio iniziare anche io a scrivere del codice per 'sta cosa, giusto per cultura personale! Partiamo dal file che deve contenere questa Tassonomia. L'idea (come anche spiegato nel documento) di mettere in ogni riga: Codice:
<nomeCategoria> <nomeCategoriaPadre> <numeroProprietàSpecificheDellaCategoria> <Proprieta_1> … <Proprieta_N> La struttura della Tassonomia è sostanzialmente una struttura ad albero. In questi casi un bel file XML sarebbe l'ottimale ma forse sarebbe troppo complessa la sua gestione (dovresti usare un parser "C" per file XML, come la libxml, per esempio). Una cosa un po' più "leggera" rispetto ad XML per strutturare una gerarchia di elementi potrebbe essere (è una ipotesi) un file di testo organizzato così: Codice:
[Veicoli da trasporto]
{
@proprietà1
@proprietà2
[Per Mare]
{
@proprietà1
@proprietà2
}
[Per Terra]
{
@proprietà1
[Su Rotaia]
{
@proprietà1
}
[Su Ruota]
{
@proprietà1
}
}
[Per Aria]
{
@proprietà1
}
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 06-01-2006 alle 14:27. |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Quote:
cmq mi piace l'idea...ma mi servirebbero info su come analizzare la struttura di questo file tramite il C P.S. mi fa piacere che ti stai interessando, anche a me il tipo di esercizio piace abbastanza, è intrigante...ricordo che devo dare una bozza entro l'8 di questo mese e l'esercizio completo entro il 15
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:26.



















