Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-09-2008, 16:43   #1
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6029
[C++] Lettura file testo con tag

Ciao ragazzi, volevo chiedervi quale è il modo più intelligente per leggere un file di questo tipo:

Codice:
[name]
  nome = pippo
[surname]
  cognome = topolino

[tag_1]
  val_1 = a;
[tag_2] 
val_2 = b;
..
..
[tag_n] 
 val_n = n
i valori dentro tag sono casuali. E' solo per dare un'idea. E non tutti hanno un numero progressivo nel nome. Sto smanettando un pò con le string, ma e' piuttosto spartano.

I tag potrebbero anche non essere in questo ordine ( almeno quelli senza numero progressivo)

Ultima modifica di Unrue : 22-09-2008 alle 16:47.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 20:15   #2
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ciao ragazzi, volevo chiedervi quale è il modo più intelligente per leggere un file di questo tipo:

Codice:
[name]
  nome = pippo
[surname]
  cognome = topolino

[tag_1]
  val_1 = a;
[tag_2] 
val_2 = b;
..
..
[tag_n] 
 val_n = n
i valori dentro tag sono casuali. E' solo per dare un'idea. E non tutti hanno un numero progressivo nel nome. Sto smanettando un pò con le string, ma e' piuttosto spartano.

I tag potrebbero anche non essere in questo ordine ( almeno quelli senza numero progressivo)
Dipende da cosa intendi per 'modo più intelligente'. Se ti riferisci alle prestazioni la cosa si può agevolmente risolvere con un automa a stati finiti.
Il prezzo da pagare è nella maggiore quantità, rispetto ad altre soluzioni, di linee di codice da scrivere. Se questo prezzo sei disposto a pagarlo, ti posso fare un esempio.

Ciao
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 21:07   #3
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Be' se le tag iniziano e finiscono con [] e non sono precedute da spazi direi:
  • leggi la riga
  • controlla che inizi per [
  • se è vero, leggi il nome della nuova tag finché non incontri ] e poi ricomincia a leggere da una nuova riga
  • se non è vero, allora elimina gli spazi iniziali e finali in eccedenza
  • controlla la stringa: se è vuota, torna all'inizio leggendo la prossima riga
  • in caso contrario leggi la riga col valore
e ovviamente mi occuperei di gestire correttamente il parsing della riga (salto i punti di quest'ultimo passo, che sono comunque simili). Giusto un'idea.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 22-09-2008 alle 21:14.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 00:24   #4
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Si, basta usare l'operatore >> dal file, che ottiene una parola escludendo spazi e caratteri whitespace in generale... quindi controllare se il primo carattere della stringa ottenuta è [, e se l'ultimo è ].

Se è vero interpreti il testo interno come comando, e le stringhe successive come parametri, o roba del genere
Poi, quando incontri una nuova tag resetti i parametri e rifai da capo.

Cmq che ci devi fare con le istruzioni dopo le tags? e come sono strutturate?
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 11:18   #5
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6029
Quote:
Originariamente inviato da Tommo Guarda i messaggi
Si, basta usare l'operatore >> dal file, che ottiene una parola escludendo spazi e caratteri whitespace in generale... quindi controllare se il primo carattere della stringa ottenuta è [, e se l'ultimo è ].

Se è vero interpreti il testo interno come comando, e le stringhe successive come parametri, o roba del genere
Poi, quando incontri una nuova tag resetti i parametri e rifai da capo.

Cmq che ci devi fare con le istruzioni dopo le tags? e come sono strutturate?
Con quei tag devo inizializzare dei valori all'interno di alcune classi. Solo che qualche tag potrebbe non essere presente. Ad esempio, se includo tutti i tag possibili da leggere in un blocco try/catch, se un tag non è presente, quindi si entra nel blocco catch, è possibile rientrare nel try, ma partendo dalla riga dopo che ha generato il catch? Al momento mi sfugge come si faccia

Ultima modifica di Unrue : 23-09-2008 alle 11:21.
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 12:34   #6
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Potresti usare le regex.
Potresti usare automi a stati finiti, implementando la lettura manuale riga per riga.

Ma perchè complicarsi la vita e non usare l'XML? Trovi parser già pronti per tutte le esigenze.
Se proprio vuoi scriverti un parser a mano devi considerare che potresti trovare anche documenti non validi, esempio valori con i caratteri "riservati" "[" o "]"
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 13:03   #7
Unrue
Senior Member
 
L'Avatar di Unrue
 
Iscritto dal: Nov 2002
Messaggi: 6029
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Potresti usare le regex.
Potresti usare automi a stati finiti, implementando la lettura manuale riga per riga.

Ma perchè complicarsi la vita e non usare l'XML? Trovi parser già pronti per tutte le esigenze.
Se proprio vuoi scriverti un parser a mano devi considerare che potresti trovare anche documenti non validi, esempio valori con i caratteri "riservati" "[" o "]"
Anche io volevo usare XML, ma devo usare questo formato e non lo posso cambiare
Unrue è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 13:07   #8
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Potresti usare le regex.
Potresti usare automi a stati finiti, implementando la lettura manuale riga per riga.

Ma perchè complicarsi la vita e non usare l'XML? Trovi parser già pronti per tutte le esigenze.
Se proprio vuoi scriverti un parser a mano devi considerare che potresti trovare anche documenti non validi, esempio valori con i caratteri "riservati" "[" o "]"
Quelli che hai descritto sono problemi agevolmente gestibili con un automa a stati. Anzi, è proprio per risolvere questo tipo di problemi che sono stati ideati gli automi.
Secondo me è già un complicarsi la vita usare usare un file in formato XML dovendo stare attenti a rispettare la corretta struttura dei nodi quando se ne crea uno.
In fondo si tratta di effettuare il parsing di un semplice file, non dobbiamo certo implementare un compilatore.

P.S.
E se fosse necessario tenere conto delle prestazioni, implementare a mano la propria libreria per regex non sarebbe una cattiva idea: http://swtch.com/~rsc/regexp/regexp1.html

Ultima modifica di Vincenzo1968 : 23-09-2008 alle 13:44.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 14:31   #9
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Con quei tag devo inizializzare dei valori all'interno di alcune classi. Solo che qualche tag potrebbe non essere presente. Ad esempio, se includo tutti i tag possibili da leggere in un blocco try/catch, se un tag non è presente, quindi si entra nel blocco catch, è possibile rientrare nel try, ma partendo dalla riga dopo che ha generato il catch? Al momento mi sfugge come si faccia
Mi pare eccessivo usare il try catch, in realtà basta benissimo una sequenza di if else:

Codice:
string s;
file >> s;

if( s[0] == '[' && s[s.length()] == ']')
{
     if( s == "[name]")  {...}
     else if( s == "[surname]" ) {...}
     else if( s == ... ) {...}
}
E così via... in questo modo poi le tags possono essere messe in qualsiasi maniera, o mancare del tutto.
Semplicemente, quando vengono lette il codice corrispondente è attivato.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 14:32   #10
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Ciao ragazzi, volevo chiedervi quale è il modo più intelligente per leggere un file di questo tipo:

Codice:
[name]
  nome = pippo
[surname]
  cognome = topolino

[tag_1]
  val_1 = a;
[tag_2] 
val_2 = b;
..
..
[tag_n] 
 val_n = n
i valori dentro tag sono casuali. E' solo per dare un'idea. E non tutti hanno un numero progressivo nel nome. Sto smanettando un pò con le string, ma e' piuttosto spartano.

I tag potrebbero anche non essere in questo ordine ( almeno quelli senza numero progressivo)
Alternative:
1 - Fai a mano, come spiegato sopra. Se non hai bisogno di un gran controllo sugli errori puo' essere una alternativa abbastsanza rapido.
2 - Regex, usando una delle varie librerie presenti, ad esempio quella in boost (http://www.boost.org/doc/libs/1_36_0...tml/index.html)
Ti viene abbastanza facile, visto che la regex per l'inizio sezione e' "\[(.*?)\]", mentre quella delle keywords puoi partire da qualcosa tipo "(.*?)=(.*?)" (per poi fare eventualmente tu conversioni e trim): lavori una linea alla volta, se la linea matcha la prima regex cominci una nuova sezione, se matcha la seconda aggiorni la map (o quel che usi) e se entrambe falliscono errore.
3 - Usi un generatore di parser piu' complesso (tipo http://spirit.sourceforge.net) ma non penso ne valga la pena.


Il modo piu' semplice e' probabilmente usare uno tra il metodo 1 e 2, leggere riga per riga, se e' del primo tipo inizi la nuova sezione, se del secondo metti in mappa il valore, altrimenti segnali l'errore.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele

Ultima modifica di marco.r : 23-09-2008 alle 14:39. Motivo: Ma porc, mi aveva castrato il messaggio :confused:
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 14:34   #11
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da Unrue Guarda i messaggi
Anche io volevo usare XML, ma devo usare questo formato e non lo posso cambiare
Parafrasando Jamie Zawinski,
Quote:
Some people, when confronted with a configuration file, think “I know, I’ll use XML.” Now they have two problems.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 23:13   #12
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
File tags.txt:
Codice:
[name]
  nome = pippo
[surname]
  cognome = topolino

[tag_1]
  val_1 = a
[tag_2] 
  val_2 = b
[tag_n] 
  val_n = n
File tags2.txt:
Codice:
[name]
 nome = 
[surname]
 cognome = topolino   

[tag_1]
  v#al_1 = a
[tag_2] 
  val_2  b
[8tag_n] 
 = n


Codice:
#include <iostream>
using namespace std;
#include "SectionsFileAutomaton.h"

int main()
{
	string section;
	string val_name;
	string val;

	char *szFileName1 = "C:\\Scaricamenti\\Temp\\tags.txt";
	char *szFileName2 = "C:\\Scaricamenti\\Temp\\tags2.txt";

	try
	{
		Automaton myAutomaton(szFileName1);

		cout << endl << "File " << szFileName1 << endl;
		for ( int k = 0; k < myAutomaton.getNumErrors(); k++ )
			cout << endl << myAutomaton.m_errors[k] << endl;
		cout << endl;

		section = "surname";
		val_name = "cognome";
		if ( myAutomaton.getValue(section, val_name, val) )
			cout << section << " -> " << val_name << " = '" << val << "'" << endl;
		else
			cout << section << " -> " << val_name << " non trovato." << endl;
		cout << endl;

		section = "prova";
		val_name = "niente";
		if ( myAutomaton.getValue(section, val_name, val) )
			cout << section << " -> " << val_name << " = '" << val << "'" << endl;
		else
			cout << section << " -> " << val_name << " non trovato." << endl;
		cout << endl;



		myAutomaton.readFile(szFileName2);

		cout << endl << "File " << szFileName2 << endl;
		for ( int k = 0; k < myAutomaton.getNumErrors(); k++ )
			cout << endl << myAutomaton.m_errors[k] << endl;
		cout << endl;

		section = "surname";
		val_name = "cognome";
		if ( myAutomaton.getValue(section, val_name, val) )
			cout << section << " -> " << val_name << " = '" << val << "'" << endl;
		else
			cout << section << " -> " << val_name << " non trovato." << endl;
		cout << endl;
	}
	catch(AutomatonException ex)
	{
		cout << ex.getMessage() << endl;
	}

	return 0;
}
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2008, 23:45   #13
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
E' analogo al formato dei file INI.
http://it.wikipedia.org/wiki/File_INI
Sotto Windows ci sono gia' delle API che permettono di leggere agevolmente questi tipi di file, essendo che erano i file di configurazione preferiti sotto Windows 3.11 e 95
Esistono tantissimi wrapper che circondano il cuore di queste API, quindi se la tua implementazione e' sotto Windows puoi cercare con google qualcosa tipo
Visual c++ read ini file
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
Adesso ci si può laureare in stor...
Impact.com ridefinisce il performance ma...
Nintendo non considera le mod dannose pe...
Dreame inaugura il suo flagship store a ...
OpenAI e Jony Ive: in arrivo un disposit...
TikTok, secondo Trump l'accordo con Xi &...
HUAWEI, tutte le novità dell'even...
Mercedes GenH2 Truck sulle Alpi: oltre 1...
Shadow Leak: ecco come ChatGPT poteva es...
Google Gemini 2.5 batte quasi tutti gli ...
Battlefield 6: i giocatori console non p...
Iliad rinnova l'offerta mobile: tre pian...
HUAWEI Watch GT 6 ufficiale: design al t...
Reggie Townsend di SAS: l’etica dell’IA ...
Startup Marathon in vista del traguardo:...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 23:41.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v