Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di wolf64
    Registrato dal
    Jul 2001
    Messaggi
    521

    [C] Scrittura e cancellazione nei file

    Sto scrivendo un programma di esercizio tratto dal libro "Linguaggio C" di Bellini e Guidi, edito dalla Mc, lo cito in quanto qualcuno magari lo ha già letto, sono al capitolo 13, "File".
    Si tratta di un programma "rubrica" che usufruisce di funzioni di inserimento dei nominativi, ricerca, modifica, cancellazione, ecc. appoggiandosi su di un file che io ho chiamato "rubrica.dat", ma arriviamo al problema (di cui non ho trovato la soluzione in quanto ci sono le soluzioni di molti esercizi ma non di tutti, ed è il caso di questo ):
    Quando utilizzo la funzione per cancellare un nominativo mi conserva uno spazio nel file che viene visto poi dai programmi di visualizzazione, ad esempio se ho i dati del sig Bianchi, del sig Rossi e del sig Neri, cancello il sig Rossi, in una visualizzazione completa vedrò in sequenza il sig Bianchi, una schermata con i campi dei dati (Cognome, Nome, Indir., ecc.) vuoti (dove c'era il sig Rossi che ho cancellato) e il sig Neri.
    Questo non mi succedeva quando nella struct avevo pochi membri (cognome, nome, numero di telefono), cioè in un esempio come sopra avrei visto in sequenza il sig Bianchi e il sig Neri senza avere lo spazio vuoto.
    Spero di essere stato sufficientemente chiaro, per maggior completezza posto di seguito la funzione di cancellazione:

    void elimina(long pos) {
    strncpy(rubrica.cognome, "", NN);
    strncpy(rubrica.nome, "", NN);
    strncpy(rubrica.numero, "", TN);
    strncpy(rubrica.defin_via, "", TN);
    strncpy(rubrica.via, "", NN);
    strncpy(rubrica.num_civ, "", CN);
    strncpy(rubrica.cap, "", CN);
    strncpy(rubrica.citta, "", NN);
    strncpy(rubrica.provincia, "", NN);
    strncpy(rubrica.stato, "", NN);

    fp = fopen("rubrica.dat", "r+");
    fseek(fp, pos, 0);
    fwrite(&rubrica, sizeof(Archivio), 1, fp);
    fclose(fp);
    return;
    }

    Come vedete è abbastanza semplice, "Archivio" è il typedef della struct.
    Tra l'altro ho applicato i consigli di usare "strncpy" al posto di "strcpy", meglio abituarsi
    L'unico parametro è "pos" che mi arriva da una funzione di ricerca del nominativo.
    Il resto dovrebbe essere abbastanza comprensibile, "rubrica" e il puntatore al file "fp" sono dichiarati globalmente, comunque a parte l'uso di "strncpy" al posto di "strcpy" la funzione è perfettamente simile a quanto riportato dal libro
    Grazie in anticipo
    Powered by Slack Current - Kernel 2.6.22
    Slackware Evangelist
    My LUG (Linux User Group): LinuxVar (LUG di Varese)

  2. #2
    Dunque, non saprei dirti sul tuo metodo perchè sinceramente è la prima volta che lo vedo, cmq io di solito faccio così:
    SE il file è disordinato leggo l'ultimo record dal file e lo scrivo sopra a quello da cancellare, dopodichè diminuisco la dimensione del file di sizeof(record) dove record è il nome della mia struttura.
    SE il file è ordinato allora copio tutto il file (record per record) in un nuovo file escludendo il record da cancellare. Poi chiudo i due puntatoria file che avrò usato, elimino il file vecchio, rinomino quello nuovo con lo stesso nome del file vecchio e riapro il primo puntatore (quello che puntava inizialmente all'archivio)
    Lo so che può sembrare un po' complicato ma funziona
    Ciao

  3. #3
    Utente di HTML.it L'avatar di wolf64
    Registrato dal
    Jul 2001
    Messaggi
    521
    [supersaibal]Originariamente inviato da bovino666
    Dunque, non saprei dirti sul tuo metodo perchè sinceramente è la prima volta che lo vedo, cmq io di solito faccio così:
    SE il file è disordinato leggo l'ultimo record dal file e lo scrivo sopra a quello da cancellare, dopodichè diminuisco la dimensione del file di sizeof(record) dove record è il nome della mia struttura.
    SE il file è ordinato allora copio tutto il file (record per record) in un nuovo file escludendo il record da cancellare. Poi chiudo i due puntatoria file che avrò usato, elimino il file vecchio, rinomino quello nuovo con lo stesso nome del file vecchio e riapro il primo puntatore (quello che puntava inizialmente all'archivio)
    Lo so che può sembrare un po' complicato ma funziona
    Ciao [/supersaibal]
    Grazie mille Bovino, in effetti col tuo sistema non rischi il problema che ho incontrato, proverò ad usarlo anch'io, per curiosità comunque faccio anche qualche prova togliendo e aggiungendo membri nella struttura in modo da cercare di capire il perchè quando avevo tre membri non me lo faceva e poi si.
    Magari mando una mail anche agli autori del libro spiegandogli l'inconveniente, se mi rispondono aggiungo il post in coda a questo 3d, anche solo per togliermi una curiosità.
    Grazie ancora
    Ciao
    Powered by Slack Current - Kernel 2.6.22
    Slackware Evangelist
    My LUG (Linux User Group): LinuxVar (LUG di Varese)

  4. #4
    Aspetterò con ansia
    Ciao

  5. #5
    Utente di HTML.it L'avatar di wolf64
    Registrato dal
    Jul 2001
    Messaggi
    521
    [supersaibal]Originariamente inviato da bovino666
    Aspetterò con ansia
    Ciao [/supersaibal]
    :gren: :gren: :gren:
    Powered by Slack Current - Kernel 2.6.22
    Slackware Evangelist
    My LUG (Linux User Group): LinuxVar (LUG di Varese)

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.