Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2014
    Messaggi
    5

    [C] Lettura/Scrittura File Binari

    Ciao ragazzi , vi scrivo per chiedervi aiuto.
    Ho la necessità di realizzare una funzione che sia in grado di inserire ciclicamente all'interno di un file binario la seguente struttura:
    struct Record{
    char str[30];
    int n;
    }
    str è una sequenza di 30 caratteri che possono essere solamente 0,1,2 , n ovviamente un intero che tiene traccia del numero di volte che ho tentato di inserire una sequenza simile.
    Ho deciso di utilizzare il file con accesso causale così da poter avere un accesso diretto ad ogni struttura inserita.

    Ogni volta che devo inserire una struttura genero una chiave valutando in base 3 str ed arrotondando al primo multiplo di 36 prossimo alla chiave generata ( 36 in quanto sizeof(struct ...) è proprio 36).
    Mi posiziono con fseek(fp,key,SEEK_SET) ,leggo con fread(recordtest, sizeof(struct), 1, fp) se in quella posizione c'è già un campo con la stessa chiave,
    se sì aggiorno n(contatore) altrimenti mi riposiziono con fseek e scrivo con fwrite(record,sizeof(struct),1,fp) in quella posizione.

    Purtroppo non funziona, non riesco a capire se sia perchè le chiavi generate siano numeri troppo grandi, considerato che il numero massimo è 3^30 -1 oppure faccio caos nel posizionarmi all'interno del file.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Posta il codice che hai usato e ne parliamo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2014
    Messaggi
    5
    Sì scusami.

    Codice :
    codice:
    typedef struct record
    {
        char code[DAY+1];
        int occ;
    }Record;
    
    void saveRecord(char *nomeFile,Record *vrecord)
    {
        long long int key;
        int i;
        FILE *fp;
        fp = fopen(nomeFile,"wb");
        if(fp==NULL)
            return;
        for(i = 0; i < Nrecord ; i++)
        {
            key = hash(vrecord[i].code);
            fseek(fp,key,SEEK_SET);
            fwrite(&vrecord[i],sizeof(Record),1,fp);
        }
        fclose(fp);
        return;
    
    }
    long long int hash(char *vett)
    {
        long long int i,c;
        long long int mod;
        long long int key=0;
        for(i=DAY-1;i>=0;i--)
        {
            c =(int)vett[i]-48;
            key += pow(3,DAY-1-i)*c;
        }
        mod = key%36;
        if(mod>0)
            {
                mod = 36-mod;
                key+=mod;
            }
        return key;
    
    }
    Ultima modifica di kry87; 18-09-2014 a 21:11

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ovviamente 3^30 è veramente troppo e quindi devi rivedere il calcolo della chiave ... (non so esattamente a cosa ti serva ma il metodo non è applicabile).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2014
    Messaggi
    5
    La stringa all'interno della struttura contiene una sequenza di 0,1,2 quindi mi è molto comoda quella funzione di hash perchè non mi darà mai due chiavi uguali. Non esiste una fseek che lavori su un long long ?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il problema è che così potresti avere un file di

    7.412.080.755.407.364 (!)

    byte (ovvero più di 7000 TB) non gestibile in molti casi.

    Comunque, esiste la fseek64 ... dipende dal compilatore/sistema.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2014
    Messaggi
    5
    Decisamente non gestibile non avevo considerato questo aspetto.
    Tenendo conto che le combinazioni possibili di cui devo tenere traccia sono 205.891.132.094.648 , quale sarebbe una soluzione conveniente?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Date le premesse, non mi pare ci sia soluzione. Se la necessità è di memorizzare *tutti* i dati, questi sono decisamente troppi.

    Se i dati da memorizzare sono in numero comunque limitato, puoi generare una chiave con un algoritmo e gestire le collisioni.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2014
    Messaggi
    5
    Ma in quale struttura? sempre in un file ?
    Anche gestendo le collisioni la dimensione massima nel caso siano presenti tutte le sequenze sarebbe quella giusto?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Infatti ti ho scritto

    Se la necessità è di memorizzare *tutti* i dati, questi sono decisamente troppi.

    e non c'è soluzione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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