PDA

Visualizza la versione completa : [c++]stampa a video solo determinate info


cleaner
16-02-2009, 21:41
mm, allora ho un file di testo disposto in questo modo:

202674
992547
892157
CODE:2345
DTE:16-2-09
#
66712
992547
CODE:99400
DTE:13-2-09
#

io prima di tutto lo leggo interamente e lo suddivido in tante righe:


void stampa_elenco(string mg)
{
j=0;
fstream leggifile("lista.txt",ios::in);
if(!leggifile) cout << "impossibile aprire la lista";
while(!leggifile.eof())
{
leggifile.getline(riga_letta[j++],MAX_LINE_LEN);
}
leggifile.close();
for(int y = 0 ; y < j-1 ; y++)
{
if(strncmp(strings[y],mg,5))
{
cout << "trovata";
}
}



}


Ora dentro il for devo confrontare se la linea è uguale ad una determinata stringa(il parametro della funzione) ,l'ho fatto solo che dovrei dirgli che se l'ha trovato ed ha incontrato un asterisco non lo stampa più..altrimenti mi stampa lo stesso dato 5-6 volte tipo..ora in caso affermativo stampare tutto quello che c'è dentro al blocco; ad esempio:

stringa --> 992547
Essendo presente in entrambi i blocchi(i blocchi li intendo come delimitati dal cancelletto), stamperò a video:

992547
CODE:2345
DTE:16-2-09
CODE:99400
DTE:13-2-09

come posso fare?! sono abbastanza in crisi :(

oregon
16-02-2009, 23:23
Io non ho capito cosa vuoi fare ...

cleaner
16-02-2009, 23:25
non saprei propio come esprimere in codice:
se trovi la matricola, stampa tutte le righe che iniziano per CODE: e DTE: e fermati quando incontri il primo cancelletto.

sono stato più chiaro?! altrimenti chiedi pure ^^ grazie

oregon
16-02-2009, 23:27
Ma cosa vuoi dire con la faccenda dell' asterisco ?

cleaner
16-02-2009, 23:35
nel senso che ogni "blocco" oltre ad essere delimitato da un asterisco contiene sempre:
CODE:xxxx
DTE: xxxx

con "code" e "dte" fissi; per questo ho inserito il delimitatore('*'), una volta trovata la stringa a me serve stampare a video i due "code" e "dte" successivi..
mi sono spiegato meglio? :zizi:

ad esempio:
202674
992547
892157
CODE:2345
DTE:16-2-09
#
66712
992547
CODE:99400
DTE:13-2-09
#

se trovassi 892157 io voglio stampare SOLO
CODE:2345
DTE:16-2-09
e basta..

oregon
16-02-2009, 23:47
Ma non ci vedo o nei blocchi che hai indicato l'asterisco * non c'e'???

cleaner
16-02-2009, 23:50
scusami..il cancelletto che scemo ho sbagliato...

oregon
17-02-2009, 00:49
Originariamente inviato da cleaner
scusami..il cancelletto che scemo ho sbagliato...

Ne avrei avuto di tempo a cercare l'asterisco ...

Comunque, qualcosa del genere ...



#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void stampa_elenco(string mg)
{
int st=0;
string line;

fstream leggifile("lista.txt", ios::in);
while(!leggifile.eof())
{
leggifile >> line;

switch(st)
{
case 0:
if(line==mg) st=1;
break;
case 1:
if(line.substr(0, 5)=="CODE:")
cout << line << endl;
if(line.substr(0, 4)=="DTE:")
{
cout << line << endl;
st=2;
}
break;
case 2:
break;
}
}

leggifile.close();
}

int main()
{
stampa_elenco("892157");

return 0;
}

cleaner
18-02-2009, 00:04
perfetta;) grande!

cleaner
21-02-2009, 10:51
azz mi sono accorto di un piccolo problema, all'inizio mi era propio sfuggito..
se la stringa mg è ripetuta più volte nel file, quella funzione stampa i corrispettivi 'CODE:' e 'DTE:' una sola volta..ad esempio:


202674
992547
892157
CODE:2345
DTE:16-2-09
#
66712
992547
202674
CODE:99400
DTE:13-2-09
#

'202674' compare due volte..il problema è che se lancio la funzione, l'output è :

202674
CODE:2345
DTE:16-2-09

INVECE CHE:


202674
CODE:2345
DTE:16-2-09
CODE:99400
DTE:13-2-09

mm..c'è qualcosa che non quadra, io avevo capito che quel codice leggeva fino alla fine del file..per questo lo incontra per forza due volte '202674'... :master:

Loading