Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    6

    C++ _ come copiate campo struct da un file e aggiungerlo su un secondo file (con ciclo while)?

    Mi accontento di un esempio generale ma se volete ho il testo dell'esercizio :

    /*
    1. Un aeroporto deve gestire la distribuzione dei bagagli in stiva nei voli operativi.
    Ogni bagaglio è caratterizzato dalle seguenti informazioni:


    codice dell’etichetta,
    nome passeggero, cognome passeggero,
    codice volo.


    Le informazioni relative ai bagagli sono memorizzate in un file: “Bagagli.dat”.
    In un altro file, “Nastri.dat”, è invece memorizzato il nastro di restituzione per ogni codice di volo
    (“Nastri.dat” è un file strutturato, in cui ogni struttura ha due campi: codice del volo e numero di nastro).
    Si progetti un programma che consenta la scelta tra le seguenti opzioni:


    Inserimento di un nuovo bagaglio in "Bagagli.dat"
    Inserimento di una informazione di restituzione in "Nastri.dat"
    Visualizzazione del nastro di restituzione di un bagaglio, data la sua etichetta.
    */
    Ho già svolto il primo punto ma non riesco a finire il secondo perché devo avere lo stesso codice_volo inserito in Bagagli.dat anche nel secondo file.
    grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma che tipo di aiuto ti serve? Dove incontri problemi in particolare con il codice? Mostra cosa hai scritto e dove trovi problemi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    Seguendo la logica , se esiste un "Nastro" esiste un "bagaglio"
    Quindi ricercherai nel file Bagagli.dat , la struttura che ha l'etichetta voluta , trovata l'etichetta hai trovato anche il codice_volo.
    Con una seconda ricerca nel file
    Nastri.dat , ricercherai il codice_volo , trovandolo , avrai trovato anche il "numero di nastro ".
    Stampi i dati .

    Quindi ti serve aprire i due file , leggerli in maniera sequenziale con un ciclo while() , e tramite una condizione if() controllare di aver trovato , nel primo l'etichetta cercata , nel secondo il codice volo cercato .
    Tecnologia

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    6
    io ho chiamato le struct nel seguente modo:

    codice:
    typedef struct {
        char cod_e[COD];
        char nome[MAX];
        char cognome[MAX];
        char cod_v[COD];
    }Bagaglio;
    
    
    typedef struct
    {
        char codice_v[COD];
        int num_nastro;
    }Nastro;
    
    poi ho inserito il bagaglio nel file nel seguente modo:
    
    void inserisci(Bagaglio par)
    {
        FILE *fp;
        fp=fopen("Bagagli.txt","ab");
        if(fp!=NULL)
        {
            fwrite(&par, sizeof(Bagaglio),1,fp);
    
    
        }
        else printf("errore di apertura file\n");
    }

    Per creare il secondo file devo aprire il primo, leggere struct dopo struct fino a quando non trovo EOF, poi devo copiare il campo cod_v in Nastri.dat e allo stesso tempo inserire da tastiera il numero del nastro per ogni bagaglio e un' informazione di restituzione.
    Io non so come fare a copiare il campo cod_v nel secondo file ..... Conosco le istruzioni fread, fwrite, ftell, fseek e le altre varie funzioni di lettura ma non si tratta di una ricerca bensì di un "copia-incolla sequenziale" che non ho mai fatto.
    In poche parole non so come creare il file nastri.dat.
    Ultima modifica di LeleFT; 04-07-2014 a 17:06 Motivo: Aggiunti i tag CODE

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    6
    A me verrebbe in mente una cosa del genere ma è sicuramente sbagliato il ciclo while.


    codice:
    void inserisci_nastro()
    {
        FILE *f1, *f2;
        Bagaglio var1;
        Nastro var2;
        int num_n;
        char ch;
        long pos;
    
    
        if((f1=fopen("Bagagli.txt","rb"))!=NULL)
        {
           if((f2=fopen("Nastri.txt","ab"))!=NULL)
           {
    
    
    
    
    
    
           while((fread(&var1, sizeof(Bagaglio),1,f1))!=feof(f1))
           {
               pos= ftell(f1) - sizeof(Bagaglio);
               fseek(f1, pos, SEEK_SET);
               fwrite(&var2, sizeof(Nastro), 1, f2);
               printf("Inserisci numero nastro restituzione\n");
               scanf("%d", &num_n);
               fprintf(f2,"numero nastro: %d", &num_n);
               fflush(stdin);
              /* printf("Inserisci informazione di consegna del bagaglio %s\n", &var2.codice_v);
               scanf("%s", ch);
               fprintf(f2,"*INFO*: %s", ch);
               fflush(stdin);*/
    
    
           }
    
    
           }
           else printf("Errore\n");
        }
        else printf("Errore\n");
    
    
        fclose(f1);
        fclose(f2);
    }
    Ultima modifica di LeleFT; 04-07-2014 a 17:06 Motivo: Aggiunti i tag CODE

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    6
    Rileggendo il testo penso di aver capito male una cosa .... il file Nastri. dat esiste già quindi io dovrei solo posizionarmi alla fine di una struct "nastro", usando come parametro un codice volo e scrivere il commento sulla restituzione del bagaglio ??
    Comunque sia non so come fare a prendere il campo di una struc da un file e metterlo su un secondo file e poi volendo aggiungere qualche altra informazione in coda al campo appena copiato.
    Se qualcuno sa dirmi almeno in pseudo codice come fare gli sarei grato a vita.

  7. #7
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Mi scuso a priori in caso io non abbia capito bene , e mi sfuggisse una complessità dell'esercizio ??

    per copiare dati da una struct a un altra , copierai i singoli campi , se sono array di char userai la funzione strcpy() del C , se sono valori interi il semplice " = " .

    Hai postato molti messaggi uno dietro l'altro e la risposta che segue forse non ti serve più ....

    Non conosco il C++ , ma visto che usi funzioni del C , ti proporrei come risolvere , dal tuo ultimo post
    mi pare di aver capito che devi fare una cosa del genere ???? Se mi sono sbagliato lascio la palla ad altri , perchè sarebbe evidente il fatto di non aver capito il tuo problema ......

    codice:
    void TuaFunzione()
    {
        FILE *fb , *fn;
        Bagaglio B;
        Nastro N;
        fb=fopen("Bagagli.txt","rb");
        fn=fopen("Nastri.dat","wb");
        while(!feof(fb))
        {
            fread(&B,sizeof(Bagaglio),1,fb);
            strcpy(N.codice_v,B.cod_v)
            printf("Inserisci  il numero del nastro per codice %s  :  ",B.cod_v);
            scanf("%d",&N.numero_nastro);
            fwrite(&N,sizeof(N),1,fn);
            if(feof(fb))
                 break;  
            
            
            
        }    
        fclose(fb);
        fclose(fn);
        
    }
    Ultima modifica di torn24; 04-07-2014 a 17:03 Motivo: modifica per ulteriori messaggi postati .
    Tecnologia

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quando posti del codice, inseriscilo all'interno degli appositi tag [CODE] .. [/CODE], in modo da mantenere indentazione e formattazione del codice. Come puoi vedere, li ho aggiunti io ai tuoi precedenti post.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    6
    Grazie mille !!! Mi scuso per tutti gli inconvenienti ma sono alle prime armi.
    Comunque l' esempio di prima mi è servito a farmi un'idea di come si fa.
    Non riesco a capire bene come funziona la fwrite .... restituisce un valore numerico se la scrittura è avvenuta?.... può essere omessa oppure no?.... come faccio a capire se il ciclo while mi prende sempre la struct che segue (nel file) una volta finito il ciclo?.... non devo incrementare una qualche variabile ad ogni giro?

  10. #10
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551
    fwrite() restituisce il numero di elementi scritti con successo
    http://www.cplusplus.com/reference/cstdio/fwrite/

    Io mi sono basato sulle tue richieste , e tue deduzioni per fornirti un esempio.
    Ma Devi capire bene cosa chiede l'esercizio , hai tre punti da sviluppare , il primo lo hai risolto , il secondo non hai capito bene cosa chiede la traccia , ma per il terzo punto dovrai risolverlo in modo simile a quanto ti ho descritto nel mio primo post .
    adesso vedi come risolvere il secondo punto , vuoi inserire per ogni bagaglio un nastro nel file , in modo automatico , puoi adottare i sistemi di cui abbiamo discusso , se invece vuoi inserire un nastro a tua scelta , basta una funzione che scriva sul file .
    ripeto per il terzo punto , invece mi sembra sensato fare una ricerca nel primo file , ricavare il codice di volo , e eseguire una ricerca nel secondo file .
    comunque hai tutti i mezzi e conoscenze per proseguire da solo .
    Ultima modifica di torn24; 04-07-2014 a 18:04
    Tecnologia

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.