Newsgroup: it.comp.lang.c++
Titolo: ricerca in un file

Salve a tutti, volevo sapere come potevo ricercare una voce particolare in
un file di testo...mi spiego meglio:
ho questo file di testo:
----------------------------------------------------------
mac.txt
----------------------------------------------------------
Configurazione IP di Windows 2000
 Nome host . . . . . . . . . . .   : xxx
 Suffisso DNS primario  . . . . .  :
 Tipo nodo . . . . . . . . . . .   : Trasmissione
 IP Routing abilitato. . . . . .   : No
 WINS Proxy abilitato. . . . . .   : No
- Scheda Ethernet Connessione alla rete locale (LAN):
 Stato del supporto . . . . . . .  : Cavo disconnesso
 Descrizione . . . . . . . . . .   : Scheda Fast Ethernet PCI Realtek
RTL8139-based
 Indirizzo fisico. . . . . . . .   : 00-A0-A2-00-3E-A3
- Scheda PPP :
 Suffisso DNS specifico connessione:
 Descrizione . . . . . . . . . .   : WAN (PPP/SLIP) Interface
 Indirizzo fisico. . . . . . . .   : 00-53-45-00-00-00
 DHCP abilitato . . . . . . . . .  : No
 Indirizzo IP. . . . . . . . . . . : xxx
 Subnet Mask . . . . . . . . . . . : 255.255.255.255
 Gateway predefinito . . . . . . . : xxx
 Server DNS. . . . . . . . . . .   : xxx
NetBIOS su Tcpip. . . . . . . . : Disabilitata
----------------------------------------------------------
In cui devo ricercare la voce "Indirizzo fisico" e farne uscire il
valore...come diamine devo fare che ci sto perdendo la testa????
Grazie a chi vorrą aiutarmi!!

 Grazie a chi vorrą aiutarmi!!
cat mac.txt | grep "Indirizzo fisico"
ah no, scusa, non ho visto che usi win2000 e che quindi devi reinventare 
l'acqua calda :-))
(scusate l'ot ma non ho resistito...)
Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 cat mac.txt | grep "Indirizzo fisico"
E da C++ si può lanciare un comando simile?
--
Luigi
--
http://web.tiscali.it/luigi_web

 E da C++ si può lanciare un comando simile?
si, basta una system("cat mac.txt | grep \"Indirizzo fisico\"")

 
in realta', per avere il valore richiesto ci vorrebbe una
cosa del genere:
grep "Indirizzo fisico" mac.txt | cut -f 2 -d':'
;-)
Fabio

 Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it
-- 
Posted from [194.214.173.28] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

> si, basta una system("cat mac.txt | grep \"Indirizzo fisico\"")
No...non va...a dire il vero io volevo farlo mettendo in buf l'intero file e
poi fare uno strcmp con "Indirizzo fisico" e trovare il valore usando i
puntatori ma non ci riesco...vorrei un algoritmo di ricerca nel file
seguendo questa strada senza usare un singolo comando...è possibile?
Grazie!!

 Grazie a chi vorrą aiutarmi!!
non mi sembra un compito cosi difficile...
Apri il file, leggi una riga alla volta su una  std::string 
(con std::getline(std::ostream &,  std::string&) )
 - cerchi il carattere ':' (con find() ) 
   e prendi quello che viene prima (chiave) 
   e quello che viene dopo (valore). (con substr())
   (se non trovi il carattere ':' , o se questo e' in fondo alla stringa,
    passi alla prossima riga)
 - Togli eventuali caratteri "." e " " in testa e in coda alle due stringhe
   (ad esempio con le find_first_not_of(), find_last_not_of() di std::string)
 - inserisci chiave e valore in un std::map<std::string, std::string>
Alla fine ti ritrovi tutti i valori del file di configurazione sulla map
e puoi farci quello che vuoi.
Se hai altre difficolta' posta un po' di codice
saluti,
Fabio

Non ti conviene scrivere diversamente i dati nel file?
Potresti comporre un record a lunghezza fissa in modo tale da poter
calcolare le posizioni esatte di ogni campo al suo interno.
ESEMPIO:
struct config
{
char host[50];
char primary_dns [50];
//...
char ethernet [50];
//...
};
Questa è la struttura del record contenente tutte le informazioni,
per scriverlo in un file utilizzi WRITE percui:
config record;
// inserisci dati specifici del record
ofstream outfile("nomefile");
outfile.write(reinterpret_cast<const_char*>(&record),sizeof(config));
Fatto questo nel file viene scritto il record di configurazione che avrà una
dimensione fissa globale ma anche ogni  campo ha una dimensione fissa, in
questo caso ad esempio ogni  campo occuba 50 byte...
Sulla base di questa struttura si può risalire al campo speficifico tramite
la manipolazione del buffer di ingresso del canale associato al file.
Ad esempio il primo campo parte da 0
il secondo da 50
il terzo 100 e così via
Soluzione migliore è quella di leggere i dati e comporli nella stessa
struttura utilizzata per la scrittura
esempio:
ifstream infile("nomefile");
config record;
infile.read(reinterpret_cast<char*>(&record),sizeof(config));
a questo punto hai nella struttura tutti i campi del record,
basterà selezionarli con l'operatore .
esempio :
char host[50];
host=record.host;
Ciao
spero di essere stato utile
Claudio


 Putroppo non posso perchè il file lo devo ottenere attravarso il comando
system("ipconfig /all > mac.txt"); in win2000 e da qui devo ricavare
l'informazione riguardante l'indirizzo fisico quindi il file non posso
crearlo io.
Grazie per l'aiuto

Guglielmo Zampella wrote:

siamo OT, cmq in C++ std non si puo' fare, bisognerebbe aprire una pipe.
Cmq il mio era un suggerimento che sottointendeva il fatto che spesso il 
c++ non e' il linguaggio piu' adatto per fare certi piccoli compiti e che 
utilizzando un linguaggio di scripting si fa piu' in fretta e meglio.
Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.


 ha scritto nel messaggio
news:TRUb7.253$1c2....@news.infostrada.it...
