Estrarre dimensione di un record, da file. Con Oggetto o Struct?

di il
8 risposte

Estrarre dimensione di un record, da file. Con Oggetto o Struct?

Buongiorno a tutti,
sono un ragazzo che si sta affacciando al mondo della programmazione ed ho un forte dubbio.

sto realizzando un programma, (Agenda) che ho scritto sotto forma di Class.
premetto che le funzioni per la creazione, modifica e lettura dei "Nuovi_Contatti" funziona, cosi come la lettura dal file su cui vengono salvati.

il dubbio che ho in questo momento è:
come faccio a capire, la dimensione dei vari record, che sono gia stati registrati, e poi "passarli" al oggetto file??
è necessario farlo attraverso una struct?

la modifica dei record riesco a farla, facendo il match del cognome cercato, e poi, facendo tornare indietro il puntatore dell'oggettoFILE di n posizioni, all'inizio di quel record.
es:

fstream file("esempio.txt", ios_base::in | ios_base::out );
string s="";

cout<<"inserire cognome da cercare";
cin>>target;
while(!file.eof()){
file>>s;
if(s==target) //supponiamo che ha trovato il cognome cercato nell'agenda e di conseguenza "so" dov'è il puntatote.
{
file.seekg( -10, ios_base::cur) //dalla posizione corrente, vai indietro di 10 posizioni.
}
//FINE

il punto è, che non conoscendo in anticipo ogni contatto inserito, se do, una quantita a seekg(), mi sballa poi nel print, perche i nomi hanno dimensioni diverse, ecc ecc.

(So bene che è un metodo sbagliato, probabilmente MOLTO sbagliato , ma ho cercato di arrangiarmi)

ecco perche, vorrei chiedervi se qualcuno ha quanto meno una direzione da darmi
grazie mille a chi mi risponde.

8 Risposte

  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    Usare il tag CODE per il codice, grazie
  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    E' molto sbagliato. Quindi non usarlo.

    Cominciamo dal fatto che il file è di tipo testo e non esiste un record di lunghezza fissa. Come lo hai scritto? Facci un esempio del suo contenuto.
  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    
    
    
    //---------------------------------------------FILE .CPP----------------------------------------
    #include "Agenda.h"
    #include<string.h>
    #include<fstream>
    #include<iostream>
    #include<cstdio>
    #include<stdio.h>
    #include<string>
    
    //COSTRUTTORE BASE
    //-----------------------------------------------COSTRUTTORI------------------------------------------------------
    Agenda::Agenda()
    {
        std::cout<<"verifica-primo costruttore vuoto"<<std::endl;
    }
    //COSTRUTTORE INIZIALIZZATO A ZERO
    
    Agenda::Agenda(std::string _nombre, std::string _apellidos, std::string _direccion, std::string _poblacion, std::string _provincia, std::string _codigo_postal, std::string _prefijo_tel, std::string _telefono)
    //: nombre{_nombre}, apellidos{_apellidos}, direccion{_direccion}, poblacion{_poblacion}, provincia{_provincia}, codigo_postal {_codigo_postal}, prefijo_tel {_prefijo_tel}, telefono {_telefono} {}
    {
        //Agenda::Nuevo_Contacto();
        nombre = _nombre;
        apellidos = _apellidos;
        direccion = _direccion;
        poblacion = _poblacion;
        provincia = _provincia;
        codigo_postal = _codigo_postal;
        prefijo_tel = _prefijo_tel;
        telefono = _telefono;
                          
    }
    //-------------------------------------------------METODI PUBLICI------------------------------------------------------------------------
    //METODO MENU - INIZIO DEL PROGRAMMA, RICHIAMA OGNI METODO, SI FA RETURN SEMPRE QUI, FINO ALLA CHIUSURA DEL PROGRAMMA
    
    void Agenda::Menu(void){
        int opc;
            do
            {
                std::cout<<"\nElige una opcion"<<std::endl;
                 std::cout<<"\n1 - Nuovo Contatto"<<std::endl;
                    std::cout<<"\n2 - Actualizacion de contactos"<<std::endl;
                        std::cout<<"\n3 - Buscar Contacto con \"Apellido\"" <<std::endl;
                            std::cout<<"\n4 - Imprimir datos"<<std::endl;
                                std::cout<<"\n9 - Terminar Programa"<<std::endl;
                                std::cin>>opc;
                                std::fflush(stdin);
    
                switch(opc)
                {
                    case 1: Nuevo_Contacto();
                            break;
                           
                    case 2: Actualizaciones();
                            break;
                           
                    case 3: Busca_Apellidos();
                            break;
                            
                    case 4: Imprimir_Agenda();
                            break;       
                }
            }
            while(opc!=9);
    }
    
    //METODO PER CERCARE UN CONTATTO, DAL COGNOME
    
    void Agenda::Busca_Apellidos(void){
        //OGGETTO PER CERCARE 
        std::string target;
    
        std::cout<<"\nIntroduce el Apellido a buscar:\t";
            std::cin>>target;
            
            //APERTURA FILE TXT
            std::ifstream Cercatore("AgendaProgettoCipsa.txt",std::ios_base::binary | std::ios_base::in | std::ios_base::app);
    
            std::string leggi="";
            std::string s;
            int i=0;
    
                     while( !Cercatore.eof())
                        {
                            Cercatore>>leggi;
                    
                            if(leggi == target)
                            {
                            
                                    Cercatore.seekg((-30),std::ios_base::cur);
                                    
                                     while (i < 8)
                                     {
                                     
                           			 std::getline(Cercatore, leggi);
                          		 	 std::cout<<leggi<<std::endl;           
                          		 	  i++;
                                	}
                         
                        }
    
                Cercatore.close();
    
    
        }
    
    //METODO PARA STAMPARE A VIDEO
    void Agenda::Imprimir_Agenda(void){
    
         std::ifstream Cercatore("AgendaProgettoCipsa.txt",std::ios_base::binary | std::ios_base::in | std::ios_base::app);
            //FILE* fp1 = fopen("AgendaProgettoCipsa.txt", "a+" );
    
    
            std::string leggi="";
            std::string s;
    
             while( !Cercatore.eof())
                        {
                            //Cercatore>>leggi;
                            std::getline(Cercatore, leggi);
                            std::cout<<leggi<<std::endl;
                        };
    
    }
    
    //METODO PER CREARE UN NUOVO CONTATTO
    
    void Agenda::Nuevo_Contacto(void){
    
        //CREAZIONE OGGETTO PER FSTREAM E CREAZIONE FILE DI TESTO PER SALVARE CONTATTI,
        //EVENTUALMENTE, CREAZIONE DI SECONDO OGGETTO FSTREAM, PER CONCATENARE INDEX????.
    
        std::fstream contattoXMLT, contattoTXT;
    
        //INIZIO DELLA CREAZIONE DEL NUOVO CONTATTO
        //INSERIMENTO VARIABILE _NOME
        std::cout<<"\nInserire Nome:\t"<<std::endl;
        std::cin>>_nombre;
        std::fflush(stdin);
            //INSERIMENTO VARIABILE _APELLIDO
            std::cout<<"\nInserire Cognome:\t"<<std::endl;
            std::cin>>_apellidos;
            std::fflush(stdin);
                //INSERIMENTO VARIABILE _DIRECCION
                std::cout<<"\nInserire Direccion:\t"<<std::endl;
                std::cin>>_direccion;
                std::fflush(stdin);
                    //INSERIMENTO POBLACION
                    std::cout<<"\nInserire Poblacion:\t"<<std::endl;
                    std::cin>>_poblacion;
                    std::fflush(stdin);
                        //INSERIMENTO PROVINCIA
                        std::cout<<"\nInserire Provincia:\t"<<std::endl;
                        std::cin>>_provincia;
                        std::fflush(stdin);
                            //INSERIMENTO CODIGO POSTAL
                            std::cout<<"\nInserire Codigo Postal:\t"<<std::endl;
                            std::cin>>_codigo_postal;
                            std::fflush(stdin);
                                //INSERIMENTO PREFIJO
                                std::cout<<"\nInserire Prefijo:\t"<<std::endl;
                                std::cin>>_prefijo_tel;
                                std::fflush(stdin);
                                    //INSERIMENTO TELEFONO
                                    std::cout<<"\nInserire Telefono:\t"<<std::endl;
                                    std::cin>>_telefono;
                                    std::fflush(stdin);
                                                //----------------------------SCRITTURA SU FILE DEL NUOVO CONTATTO-----------------------------------
        //APERTURA FILE HMLT SI SALVA E AGGIUNGE A FINE FILE
        contattoXMLT.open("AgendaProgettoCipsa.html", std::ios_base::out | std::ios_base::app);
    
        //FORMA FILE HTML
        contattoXMLT<< "<table> \n";
        contattoXMLT<< "<tr><td>NOME</td><td>COGNOME</td><td>DIRECCION</td><td>POBLACION</td><td>PROVINCIA</td><td>CODIGO POSTAL</td><td>PREFIJO</td><td>TELEFONO</td></tr> \n";
        contattoXMLT<< "<tr><td>"<<_nombre<<"</td><td>"<<_apellidos<<"</td><td>"<<_direccion<<"</td><td>"<<_poblacion<<"</td><td>"<<_provincia<<"</td><td>"<<_codigo_postal<<"</td><td>"<<_prefijo_tel<<"</td><td>"<<_telefono<<"</td></tr> \n";
        contattoXMLT<< "</table> \n";
    
        //CHIUSURA FILE HTML
        contattoXMLT.close();
    
    //APERTURA FILE TXT
    contattoTXT.open("AgendaProgettoCipsa.txt", std::ios_base::out | std::ios_base::app);
    
        //INIZIO RECORD VARIABILI FILE TXT
        contattoTXT<<"\nNome:\t";
        contattoTXT<<_nombre;
        std::fflush(stdin);
            //INSERIMENTO VARIABILE _APELLIDO
            contattoTXT<<"\nCognome:\t";
            contattoTXT<<_apellidos;
            std::fflush(stdin);
                //INSERIMENTO VARIABILE _DIRECCION
                contattoTXT<<"\nDireccion:\t";
                contattoTXT<<_direccion;
                std::fflush(stdin);
                    //INSERIMENTO POBLACION
                    contattoTXT<<"\nPoblacion:\t";
                    contattoTXT<<_poblacion;
                    std::fflush(stdin);
                        //INSERIMENTO PROVINCIA
                        contattoTXT<<"\nProvincia:\t";
                        contattoTXT<<_provincia;
                        std::fflush(stdin);
                            //INSERIMENTO CODIGO POSTAL
                            contattoTXT<<"\nCodigo Postal:\t";
                            contattoTXT<<_codigo_postal;
                            std::fflush(stdin);
                                //INSERIMENTO PREFIJO
                                contattoTXT<<"\nPrefijo:\t";
                                contattoTXT<<_prefijo_tel;
                                std::fflush(stdin);
                                    //INSERIMENTO TELEFONO
                                    contattoTXT<<"\nTelefono:\t";
                                    contattoTXT<<_telefono;
                                    std::fflush(stdin);
    
        //CHIUSURA FILE TXT
        contattoTXT.close();
    
    
                    //CHIUSURA FILE
    
        return;
    }
    
    
    
    chiedo scusa per il tag, non sapevo come si faceva..
    ho omesso dei pezzi non fondamentali, ad ogni modo nel main, ce solo un oggetto della classe, che richiama il metodo Menu().
    grazie mille per l'aiuto
  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    oregon ha scritto:


    E' molto sbagliato. Quindi non usarlo.

    Cominciamo dal fatto che il file è di tipo testo e non esiste un record di lunghezza fissa. Come lo hai scritto? Facci un esempio del suo contenuto.
    Si capisce che sto facendo da solo, e quindi probabilmente molta confusione..
    chiedo scusa in anticipo per l'Itagnolo..
    ad ogni modo, grazie del supporto e di spendere tempo per i nuovi arrivati
  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    Ma ti avevo chiesto un esempio del contenuto del file ...
  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    oregon ha scritto:


    Ma ti avevo chiesto un esempio del contenuto del file ...
    il file viene salvato in questo modo
    
    Nome:	Alberto
    Cognome:		Rossi
    Indirizzo:		Turati
    Provincia:		MI
    Prefisso:		0039
    Telefono: 		32803394930
    Nome:	Luigi
    Cognome:		Bianchi
    Indirizzo:		Turati
    Provincia:		MI
    Prefisso:		0039
    Telefono: 		32803394930
    Nome:	Mario
    Cognome:		Bassi
    Indirizzo:		Turati
    Provincia:		MI
    Prefisso:		0039
    Telefono: 		32803394930
    
    
    Scusami, ma non avevo letto bene..
  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    Un file di testo, non avendo una struttura di lunghezza fissa puo' essere acceduto SOLO sequenzialmente, cioe' leggendo uno dopo l'altro tutti i record.

    In questo caso un record e' tutto cio' che sta tra l'inizio di una riga e l'acapo finale. Dopo si che inizia un'altro record
  • Re: Estrarre dimensione di un record, da file. Con Oggetto o Struct?

    migliorabile ha scritto:


    Un file di testo, non avendo una struttura di lunghezza fissa puo' essere acceduto SOLO sequenzialmente, cioe' leggendo uno dopo l'altro tutti i record.

    In questo caso un record e' tutto cio' che sta tra l'inizio di una riga e l'acapo finale. Dopo si che inizia un'altro record
    Ok, Grazie mille!
Devi accedere o registrarti per scrivere nel forum
8 risposte