C - Modificare campo record su file

di il
22 risposte

C - Modificare campo record su file

Sto scrivendo un programma in C utilizzando i file. Il mio livello di conoscenze premetto che è basilare (tanto per intenderci sono uno studente al 4° anno perito informatico). Il programma che sto implementando è sulla gestione di un magazzino e non riesco a sovrascrivere in un campo del record di un file. Il pezzo di codice è questo


void segnala_pagato(newtype vet){
   int id;
   visualizzazione_totale(vet);
   printf("Inserisci l'id del prodotto da segnalare come pagato:");
   scanf("%d",&id);
   fp=fopen("file","r+");
   while((fread(&vet,sizeof(vet),1,fp)) > 0){
      if(id==vet.id){
         if(vet.pagato == 2){
            vet.pagato=1;
            fwrite(&vet,sizeof(vet),1,fp);
            break;
         }
      }
   }
   fclose(fp);
   getch();
}

In parole povere se il prodotto non è stato pagato il campo della struttura vet (ovvero vet.pagato) prende l'intero 2 al contrario se è stato pagato prende 1. quando vadoa fare l'inserimento metto di default che il prodotto non è stato pagato (vet.pagato==2) però poi con un altra procedura vorrei modificarna il valore. Il mio spezzone di programma in alto non funziona. Consigli? grazie in anticipo =)

22 Risposte

  • Re: C - Modificare campo record su file

    Il file quante strutture ha memorizzate? se solo una il tuo codice (assumendo che il file non è in stato già aperto perche se così fopen ti da errore e non puoi eseguire fread) aggiunge dati nella posizione corrente del file pointer. Ciò comporta che i tuoi dati sono corrotti al primo inserimento. Se molte strutture ancora peggio perche stai sovrascrivendo le altre strutture.
  • Re: C - Modificare campo record su file

    Sisi la struttura è una sola e il file lo apro e lo chiudo a ogni sottoprogramma... consiglio?
  • Re: C - Modificare campo record su file

    
    while((fread(&vet,sizeof(vet),1,fp)) > 0){
          if(id==vet.id){
             if(vet.pagato == 2){
                vet.pagato=1;
                fwrite(&vet,sizeof(vet),1,fp);
                break;
    
    una o più lo stream è al seguente rek.
  • Re: C - Modificare campo record su file

    
    fseek(fp, ftell(fp)-sizeof(vet), SEEK_SET);
    
  • Re: C - Modificare campo record su file

    Si. Prima di tutto apri il file in binario e non in text mode. memorizza la posizone del file con pos = ftell, leggi il dato, riposizionati dove ha avuto inzio la lettura con fseek(fp, pos,SEEK_SET) e riscrivi le modifiche.

    Edit: Max non vale.
  • Re: C - Modificare campo record su file

    Ops scusa...
  • Re: C - Modificare campo record su file

    Figurati. E' bello confrontare le versioni
  • Re: C - Modificare campo record su file

    Scusate ma la fseek non la so usare... vi prego me lo potreste scrivere voi :S
  • Re: C - Modificare campo record su file

    Te l'ha scritto Max sopra.
    
    fseek(fp, ftell(fp)-sizeof(vet), SEEK_SET);
    
    usalo prima di fwrite.
  • Re: C - Modificare campo record su file

    Non funziona :'(
  • Re: C - Modificare campo record su file

    vertex ha scritto:


    non funziona :'(
    cosa significa 'non funziona'
  • Re: C - Modificare campo record su file

    Che mi modifica tutto il record e tutti i campi sono vuoti :s
  • Re: C - Modificare campo record su file

    Riposta il pezzo di codice modificato ... plssss
  • Re: C - Modificare campo record su file

    Ok... io chiudo
    
    void segnala_pagato(newtype vet)
    {
       int id;
       FILE *fp;
       //visualizzazione_totale(vet);
       printf("Inserisci l'id del prodotto da segnalare come pagato:");
       scanf("%d",&id);
       if ((fp=fopen("file","rb+"))==NULL)
       {
         fprintf (stderr,"Err\n");
         return;
       }
       while((fread(&vet,sizeof(vet),1,fp)) > 0)
       {
        if(id==vet.id && vet.pagato == 2)
        {
          vet.pagato=1;
          fseek(fp, ftell(fp)-sizeof(vet), SEEK_SET);
          fwrite(&vet,sizeof(vet),1,fp);
          break;
        }
      }
      fclose (fp);
    }
    
    Ciao
Devi accedere o registrarti per scrivere nel forum
22 risposte