Gestione file

di il
19 risposte

Gestione file

Ciao a tutti!
è la prima volta cge scrivo e spero che qualcuno possa aiutarmi. sono una studentessa universitaria in trasferta erasmus. ad essere sincera di programmazione non c'ho mai capito un granchè ed ora che sto studiando in una lingua che capisco poco le cose vanno ancora peggio.
cmq vi riporto il mio grandissimo problema con il progetto che devo sviluppare.
devo gestionare dei dati di una agenzia di viaggi: ho un negozio che propone una serie di viaggi (10) identificati tramite un codice intero (queste info sono salvate in un file). in un altro file ho una lista di clienti (al massimo 50, ma all'inizio nel file devono essere meno e poi vi spiego il motivo) identificati tramite nome e codice del viaggio. la struttura di dati l'ho scritta in questo modo:
typedef int tcodigo [10]; // lista di viaggi identificata con un codice
struct CL{ //identificazione dei clienti:
string nombre; //nome
tcodigo l; //codice del viaggio (elemento della lista precendentemente definita con il typedef)
};

typedef CL tCL[50]; //lista di clienti (al max 50, ma possono essere anche meno)
struct TIENDA{ //clienti del negozio
int nCl; //numero di controllo che dice quante caselle sono piene
tCL c; //"tabla" dove ci sono i nomi dei clienti.
};

Ora ho scritto una serie di sottogrammi che sembrano andare bene ma con due ho problemi:
1. devo scrivere i dati del cliente e verificare la sua presenza nella lista, se c'è significa che ha già viaggiato quindi il sottopramma mi chiederà di inserire l'importo del nuovo viaggio e a questo applicherà uno sconto del 10% (sconto fisso per non complicare troppo le cose).
ora i miei problemi sono:
a. Se il cliente non è nella lista il sottoprogramma lo deve salvare in questa e se c'è deve salvare i dati del nuovo viaggio.
Come faccio?

Pensavo di fare:

cin>>nombre;

a questo punto un cout con "si c'è nella lista" oppure "no, non c'è e lo salvo". Quindi:

if(nombre!=" elemento della lista ") salva //come dico di salvare?
else cout>>elemento della lista //se è presente nella lista mi mostra i suoi dati.

b. Il controllo della funzione "if" che definisce lo sconto deve essere il fatto che il nominativo è stato trovato o il fatto che il cliente ha già viaggiato? (la condizione di controllo si applicherà quindi al nome o al viaggio che dovrà essere superiore a 2, uno l'attuale che verrà salvato e l'altro il precedente?)

if (viaje>1) {cin>>prezzo; //il viaggio deve essere il numero di caselle piene relative al viaggio cliente. come lo scrivo? cout<<prezzo*90/100;}

2. Il secondo sottoprogramma chiede di inserire il codice corrispondente ad una destinazione e di visualizzare l'elenco delle persone che hanno viaggiato in questa località.
Pensavo di fare una ricerca nel file relativo ai clienti:

cin<<codigo;
if(codigo== ??? ) cout>> ???

Mi spiace chiederle così tante cose e mi rendo conto che è difficile spiegarsi a distanza ma sono abbastanza preoccupata.
Il primo è il sottoprogramma base e devo assolutamente capire cosa c'è che non va.
Il mio problema è che non so bene come passare ai vari sottoprogrammi gli elementi delle varie tuplas e tablas... ancora non sono riuscita a capire come si chiamano in italiano.
Grazie a tutti e spero possiate illuminarmi!!!

laca

19 Risposte

  • Re: Gestione file

    Ciao e benvenuta sul forum.
    Considero un file fatto in questo modo:
    
    Mario Rossi, 12345
    Filippo Bianchi, 54321
    Andrea Neri, 23145
    Giorgio Bruni, 32415
    
    Se il tuo è diverso allora dovrai fare qualche piccola modifica al codice.

    Di seguito posto un esempio di programma che legge il file riga per riga, separa il nome del cliente dal codice del viaggio e confronta un nome inserito da tastiera con tutti i clienti presenti nella lista. Quindi dice se il cliente è nella lista oppure no.
    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    /*
     * Funzione che prende in ingresso una riga letta dal file
     * e restituisce il nome del cliente, cioe' tutto quello
     * che sta prima della virgola
     */
    string get_nome_cliente(string riga_file) {
    	return riga_file.substr(0, riga_file.find(","));
    }
    
    /* 
     * Funzione che prende in ingresso una riga letta dal file
     * e restituisce il codice del viaggio, cioe' tutto quello
     * che sta dopo la virgola, convertito in un intero
     */
    int get_codice_viaggio(string riga_file) {
    	int codice;
    	int pos_virgola = riga_file.find(",");
    	int lungh = riga_file.length();
    	string stringa_codice = riga_file.substr(pos_virgola+2, lungh - pos_virgola);
    	istringstream (stringa_codice) >> codice;
    	return codice;
    }
    
    
    int main(int argc, char const *argv[])
    {
    	ifstream my_file("clienti.txt");
    	string line;
    	string nome_inserito;
    
    	cout << "Inserire il nome del cliente: ";
    	getline(cin, nome_inserito);
    	cout << "Nome inserito: " << nome_inserito << endl;
    
    	bool cliente_nella_lista = false;
    
    	while(getline(my_file, line)) {
    		//cout << "Nome trovato: " << get_nome_cliente(line) << endl;
    		//cout << "Codice viaggio: " << get_codice_viaggio(line) << endl;
    		string nome_trovato = get_nome_cliente(line);
    		if (nome_inserito == nome_trovato) {
    			cout << "IL CLIENTE E' NELLA LISTA!" << endl;
    			cliente_nella_lista = true;
    		}
    	}
    
    	if(!cliente_nella_lista) {
    		cout << "Il cliente non e' nella lista: lo aggiungo" << endl;
    		
    		// TODO aggiungi il nome al file
    	}
    
    	my_file.close();
    
    	return 0;
    }
    
    Ovviamente l'ho scritto in italiano perché parlo solo italiano e inglese...

    Prova a partire da qui, e se hai altri dubbi chiedi pure.
  • Re: Gestione file

    Grazie mille minomic!
    quindi se c ho capito qualcosa per fare il mio secondo sottoprogramma dovrei fare una cosa analoga a quello che fa il primo per la ricerca del cliente e alla fine fare un cout dei nominativi.
    giusto?
    grazie ancora!
  • Re: Gestione file

    Sì esatto! Puoi riutilizzare le due funzioni per individuare il nome e il codice del viaggio, quindi ti basta confrontare il codice e, se corrisponde, stampare il nome associato.
  • Re: Gestione file

    Ciao! ho un problema!
    Non so cosa siano istringstream (...) e getline (...).
    Come posso sostituirli?
    per il resto, con un po' di impegno, ho capito tutto!
  • Re: Gestione file

    laca ha scritto:


    Non so cosa siano istringstream (...) e getline (...).
    Come posso sostituirli?
    Eh??? Anziché sostituirli potresti semplicemente studiare cosa sono... Mica possiamo sostituire tutto quello che non conosciamo!
  • Re: Gestione file

    Hai ragione!!!
    il getline h'ho cambiato in cin>>...
    è istringstream non so proprio come modificarlo con qualcosa che conosco! c ho provato!!!
    in più il programma non riconosce i nomi della lista... mai! dice sempre che non ci sono e che li salva!
    ma: se il nome c'è dice che non lo trova,
    se il nome non c'è dice che lo salva ma non lo fa!
  • Re: Gestione file

    laca ha scritto:


    il getline l'ho cambiato in cin>>...
    Veramente avevo messo getline per una ragione... Il cin si ferma al primo spazio, mentre getline legge una riga intera. Quindi se tu scrivi "Mario Rossi" il cin legge solo "Mario". Per questo non ti riconosce i nomi già presenti.

    Per quanto riguarda il fatto che non salvi i nuovi clienti... quello lo avevo lasciato da fare a te!
  • Re: Gestione file

    Bene! Allora mi manca la parte che salva il nome e... non so farla!!!
    Ti chiedo troppo se me la scrivi???
  • Re: Gestione file

    laca ha scritto:


    Bene! Allora mi manca la parte che salva il nome e... non so farla!!!
    Ti chiedo troppo se me la scrivi???
    Un po' sì...
    Dai provaci! Poi se mai concludiamo insieme...
  • Re: Gestione file

    Mmm...
    proviamo!
    ho capito che bisogna utilizzare la libreria <fstream.h> (come hai indicato tu!)
    poi dichiaro una variabile di tipo fstream file;
    poi file.open(
    file<<c;
    file.close()
    che cosa pongo nel comando file.open?
  • Re: Gestione file

    Schema molto semplice:
    1. apri il file in lettura
    2. scorri tutto il file cercando il cliente. Se lo trovi allora non devi scrivere niente e continui con il tuo programma
    3. se non trovi il cliente allora chiudi il file e lo riapri in scrittura, specificando che vuoi fare l'append altrimenti quello che scrivi va a sostituire completamente il vecchio contenuto del file, mentre tu vuoi solo aggiungere qualcosa
    4. scrivi quello che vuoi
    5. chiudi il file

    Documentazione: link.
  • Re: Gestione file

    Forse ho capito!

    ofstream my_file("cliente.txt, ios::app);
    if(!cliente_nella_lista) {
    cout << "Il cliente non nella lista la lista e lo slaviamo." << endl;
    return -1;
    }
    my_file.close();
    return 0;
  • Re: Gestione file

    Manca la scrittura vera e propria! Dov'è che gli dici che cosa deve scrivere sul file?
    E poi quel return -1 è un po' "forte": se eseguito nel main fa terminare tutto il programma!
  • Re: Gestione file

    Manca la scrittura vera e propria! Dov'è che gli dici che cosa deve scrivere sul file?
    E poi quel return -1 è un po' "forte": se eseguito nel main fa terminare tutto il programma!

    Ok, ci riprovo!
    cin<<nome;
    if(!cliente_nella_lista) {
    ofstream my_file("cliente.txt, ios::app);
    if(!cliente_nella_lista) {
    cout << "Il cliente non nella lista la lista e lo slaviamo." << endl;
    }
    my_file.close();

    più di cosi non riesco a migliorarlo!!!
Devi accedere o registrarti per scrivere nel forum
19 risposte