Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15
  1. #11
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,351
    Cosa non ti è chiaro della fwrite? Si comporta come la fread ma per scrivere e non per leggere.

    Parli di "più file" ma poi ti riferisci a "3 contatti" ... decidi, più file o più contatti ...?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  2. #12
    allora, cerco di essere il più schematico possibile

    1) ho risolto adesso con la fwrite, era un errore sul file e pensavo di sbagliare ad usare la funzione, quindi passiamoci su.

    2) parlo di più contatti. supponiamo di avere una struct rubrica con un size_t ed un puntatore che punta alla struct contatto mi segui?
    quindi io non avrò nel file solo
    nome cognome e telefono ma avrò:
    nome1, cognome1, telefono1, nome2, cognome2, telefono2, ... , nomeN, cognomeN, telefonoN.
    stavo provando a scriverlo da solo ma torno a fare l'errore di ieri del doppio puntatore il che ci porta al punto 3.

    3) ti prego puoi provare a spiegarmi perchè si usa questo doppio puntatore per gestire le malloc interne alle funzioni? sennò continuerò a sbagliare tutti gli esercizi di questo tipo..

    4) le fread tu mi hai detto leggono in sequenza i dati dal file e le vanno mettendo all'interno degli array uno dietro l'altro. ma come faccio a dire loro "leggi solo 1 dato e mettilo dentro questo array" oppure leggi a cicli di 3 dati?

    per rendere più chiara la situazione posto il codice:
    come si nota all'inizio della prima funzione cerco (senza riuscirci di mettere dentro un size_t un intero a 32 bit senza segno che si trova all'inizio del file binario ed indica quanti contatti ci sono nella mia rubrica.

    codice:
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdlib.h>
    #include <stdio.h>
    
    
    /* definisco la struttura */
    
    
    struct contatto { 
        char nome[255]; 
        char cognome[255];         
        char telefono[255]; 
    };
    struct rubrica { 
        size_t size; 
        struct contatto *contatti; 
    };
    struct rubrica *link;
    
    
    
    
     
    
    
    
    
    /* corpo della prima1 funzione */
    void rubrica_read_bin (struct rubrica *pr,FILE *f) {
        unsigned int i;
        fscanf(f, "%lu", &pr->size);
        pr->contatti=malloc(pr->size*sizeof(struct contatto));
        for(i=0;i<pr->size;i++)
            fread(pr->contatti, sizeof(struct contatto), 1, f);
     }
    /* corpo della seconda funzione */
    
    
    void rubrica_print (struct rubrica *pr, FILE *f) {
        unsigned int i;
        for(i=0;i<pr->size;i++)
            fprintf(f, "nome: %s, \ncognome: %s, \ntelefono: %s.\n", pr->contatti[i].nome, pr->contatti[i].cognome, pr->contatti[i].telefono);
    }
    
    
    /* corpo della terza funzione */
    
    
    int rubrica_find_by_name (struct rubrica *pr, char* name){
        return 0;
    }
    
    
    /*corpo principale */
    
    
    main(){
        FILE *frp;
        FILE *fwp;
        frp=fopen("rubrica1.bin", "rb");
        fwp=fopen("contatto.txt", "wt");
        if (frp==NULL || fwp==NULL){
            printf("errore nell'apertura di un file");
            system("pause");
            exit(1);
        } 
        link=malloc(sizeof(struct rubrica));
        rubrica_read_bin (link, frp);
        rubrica_print (link, fwp);
    /*    rubrica_find_by_name(link, nome); */
    }

    attendo in linea, grazie mille oregon!

  3. #13
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,351
    La lettura la scriverei così

    codice:
    void rubrica_read_bin (struct rubrica *pr, FILE *f) {
        fread(pr, sizeof(size_t), 1, f);
        if(pr->size > 0)
        {
            pr->contatti = (struct contatto *)malloc(pr->size * sizeof(struct contatto));
            if(pr->contatti) fread(pr->contatti, sizeof(struct contatto), pr->size, f);
        }
     }
    Avendo un file binario non ha senso leggere con la fscanf (che prevede dati in ASCII).
    Leggerai il numero di contatti con la prima fread (evidentemente scriverai anche con la fwrite il corrispondente valore).
    Se il valore letto sarà maggiore di zero, allocherai la memoria per tutti i contatti e con una sola fread leggerai tutti i contatti (non passerai 1 con un ciclo ma solamente pr->size per leggere tutti gli elementi).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #14
    bravissimo :-)
    va che è un piacere!

  5. #15
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,351
    Per essere veramente completo, dovresti controllare che il puntatore restituito dalla malloc non sia NULL.
    In quel caso, dovresti interrompere il programma con un messaggio di "memoria non disponibile".
    In un contesto di "test"/"didattico" va pure bene ma in "produzione" devi prevedere il controllo.

    Per finire, in generale la fread/fwrite la puoi usare tranquillamente in questo modo ma *non* puoi se nella struttura ci sono dei puntatori (che dovrai trattare a parte riallocando lo spazio come fai in questo programma).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Tag per questa discussione

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 © 2020 vBulletin Solutions, Inc. All rights reserved.