Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - controllo presenza
Forum - C/C++ - controllo presenza

Avatar
frenk88 (Normal User)
Rookie


Messaggi: 26
Iscritto: 02/07/2009

Segnala al moderatore
Postato alle 21:15
Venerdì, 10/07/2009
buonasera a tutti...ho ancora bisogno del vostro aiuto:
per una parte di progetto sto creando una funzione che mi va a leggere dei dati di persone da un file txt come (nome,cogonme,eta...ecc) e me li stampa a video.Nel file txt c'è una lista del tipo:
1;Marco;Rossi;43;Roma;
2;diego;Verdi;21;Torino;

Le varie caratteristiche sono separate da ; e io utilizzo la funzione strtok per farmele scrivere dal compilatore separate cosi in lettura mi trovo esattamente ciò che c'è scritto nel db separati anche qui da ;
Posto il cosdice che ho fatto:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>

#include "caratteristiche.h"
#include "cliente.h"
#include "clienti.h"

Clienti::Clienti()
                        {
                         ifstream is;
                         char linea[100];
                         is.open("clienti.txt", ios::in );
                         while (!is.getline(linea,100).eof()){
                         // cout << linea << endl;
                         char* pch;
                         pch = strtok (linea,";");  
                         int num_cliente=atoi(pch);
                         char* nome_cliente=strtok(NULL,";");
                         char* cognome_cliente=strtok(NULL,";");
                         int eta=atoi(strtok(NULL,";"));
                         char* citta=strtok(NULL,";");
                         Cliente prova(num_cliente,nome_cliente,cognome_cliente,eta,citta);
                         utenti.push_back(prova);}
                         is.close();
                         /*cout << num_ricetta<<endl;
                         cout << nome_ricetta<<endl;
                         cout << calorie<<endl;   */
                         }

void Clienti::AggiungiCliente(){
                              int num_cliente;
                              string nome_cliente;
                              string cognome_cliente;
                              int eta;
                              string citta;
                              cout <<"numero ";
                              cin >> num_cliente;
                              cout << endl << "nome ";
                              cin >>nome_cliente;
                              cout << endl << "cognome ";
                              cin >>cognome_cliente;
                              cout << endl << "eta ";
                              cin >>eta;
                              cout << endl << "citta ";
                              cin >>citta;
                              Cliente prova(num_cliente,nome_cliente,cognome_cliente,eta,citta);
                              utenti.push_back(prova);
                              ofstream is;
                              ofstream outfile("clienti.txt", ios::app);
                              outfile << num_cliente << ';' << nome_cliente << ';' <<cognome_cliente<<';'<< eta << ';'<<citta<<';' <<'\n';
                              outfile.close();
                              
                              }
                              
void Clienti::Stampa(){
                          
                           char linea[100];
            ifstream is;
            is.open("clienti.txt",ios::in);
            while(!is.getline(linea,100).eof())
            cout << linea << endl;
                          
}

questo codice è contenuto in un file.cpp.
IL codice di qui sopra mi permette di inserire un ulteriore utente nella lista e lo scrive nel file txt ma ora devo fare il controllo dell'esistenza già di un cliente con gli stessi dati.Cioè se in lista ho un Mario Rossi e da tastiera inserisco nuovamente Mario Rossi vorrei che il programma mi dice che c'è già un cliente con gli stessi dati e perciò non scrive niente nel db e passa ad una altra operazione.ringfrazio chi mi aiuta a modificare il codice..


PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 1:49
Sabato, 11/07/2009
[Professor mode = on]
(per la risposta breve, vedi un chilometro più in basso)

beh... è un po' incasinato il progetto... scrivere direttamente sul file, per così dire, "senza filtro" è una cosa che non ti permette grande flessibilità quando si tratta di manipolare i dati.

Una soluzione migliore sarebbe questa:

Creare una linked list (o un'altra struttura dati altrettanto facile da gestire), i cui elementi siano classi (o struct) che contengano tutte le informazioni su un dato cliente.
Quando inserisci un nuovo cliente, basta creare la memoria per la nuova classe (o per la nuova struct), inserire tutti i dati e appendere il tutto in testa o in coda alla lista. Se vogliamo essere un tantino più ordinati possiamo inserire il nuovo elemento nella lista rispettando un qualche ordine (ad esempio l'ordine lessicografico del cognome, che prenderebbe il nome di "Chiave primaria di ricerca").

A questo punto per verificare se esista o meno un certo cliente di nome mario rossi, basterebbe scorrere la lista dall'inizio alla fine (oppure soltanto fino al primo cognome che in ordine alfabetico sia maggiore o uguale a Rossi), e dare True in output se venisse trovato, False altrimenti.

Così facendo potrai decidere se inserire un nuovo elemento o aggiornare quello vecchio, o fare qualunque altra cosa tu voglia.

Le operazioni di lettura e scrittura su file questa volta sarebbero comandati dall'utente, con la pressione di un apposito tasto Salva (o Salva con nome) e un tasto Apri. Se il programma è a riga di comando puoi integrare un paio di comandi da tastiera (ad esempio "o" e "s", come Open e Save). Al comando di lettura viene letto tutto il file e compilata tutta la lista. Al comando di salvataggio viene scorsa tutta la lista e scritto tutto il file in un solo passaggio.

In questo modo (se il database è ragionevolmente piccolo, tanto da entrare nella ram fisica) si migliorano anche le prestazioni (per il minor numero di accessi al disco) e si riduce la frammentazione del filesystem dovuta a ripetute operazioni di scrittura incrementale. Un'unica operazione di scrittura può portare all'allocazione di un gruppo abbastanza grande di blocchi contigui, mentre una serie di brevi scritture può portare il sistema operativo a scegliere via via una serie di blocchi isolati (a mo' di tappabuchi) sul disco, aumentando la frammentazione....

RISPOSTA BREVE:
Leggi in sequenza tutti i record del file, per ogni record controlli se il cognome coincide con quello cercato, se trovi il cognome esci con True, altrimenti se raggiungi la fine del file senza aver trovato nulla esci con False.

Ultima modifica effettuata da TheKaneB il 11/07/2009 alle 1:54
PM Quote