Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Eliminare elemento FILE

    Salve praticamente ho due problemini riscontrati in questo codice:

    - Nella funzione cerca mi stampa "Valore non trovato" per gli elementi presenti nel file.. tipo ci sono 3 elementi e mi stampa 3 volte il messaggio.

    - Inoltre non riesco a far funzionare la funzione elimina, se conoscete un metodo migliore, io ho trovato solo questo ç_ç (mi crea il file frutta2.txt ma nel programma non funziona lo stesso..)

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct tabella{
     int cod_prod;
     char nome_prod[10];
     char tipo_prod[20];
     float prezzo;
     int cancellato;
     };
    typedef tabella frutta;
    void menu();
    void insElemento();
    void cercaElemento();
    void delElemento();
    void visElemento();
    int main(){
     int comando;
     do{
     menu();
     printf("\nComando:\t");
     scanf("%d", &comando);
     switch(comando){
      case 1:{
       insElemento();
       break;
      }
      case 2:{
       cercaElemento();
       break;
      }
      case 3:{
       delElemento();
       break;
      }
      case 4:{
       visElemento();
       break;
      }
     }
     }while(true);
     return 0; 
    }
    void menu(){
     printf("--------------------------");
     printf("\n1 - Inserisci Prodotto\n");
     printf("2 - Cerca Prodotto\n");
     printf("3 - Elimina Prodotto\n");
     printf("4 - Visualizza Prodotti\n");
     printf("--------------------------");
    }
    void insElemento(){
     int risp;
     FILE *fp;
     struct tabella frutta;
     fp=fopen("frutta.txt","a");
     do{
      printf("Inserisci il codice del prodotto: ");
      scanf("%d", &frutta.cod_prod);
      printf("Inserisci il nome del prodotto: ");
      scanf("%s", frutta.nome_prod);
      printf("Inserisci la tipologia del prodotto: ");
      scanf("%s", frutta.tipo_prod);
      printf("Inserisci il prezzo del prodotto: ");
      scanf("%f", &frutta.prezzo);
      fwrite (&frutta, sizeof (struct tabella), 1, fp);
      
      printf("Continuare? 1:SI - 0:NO\t");
      scanf("%d", &risp);
     }while (risp==1);
     fclose(fp);
    }
     void cercaElemento(){ //Ho provato il comando strcmp, ma di norma si dovrebbe fare con il codice.
      char search[10];
      FILE *fp;
      struct tabella frutta;
      printf("Inserire il nome prodotto da ricercare "); 
       scanf("%s", search); 
       fp=fopen("frutta.txt", "r"); 
       while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){
       
          if (!strcmp(frutta.nome_prod, search)) 
          {  
          printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
      }
      //PERCHE NON FUNZIONA l'ELSE?? INFATTI MI STAMPA Elemento non trovato tante volte quanto gli elementi presenti nel file.
      /*else{
      printf("Elemento non trovato!\n");
      }*/
     }
    }
     
     
     void delElemento(){
      //Cancellazione Logica
      int elimina;
      FILE *fp;
      struct tabella frutta; 
      printf("Inserire il codice prodotto da eliminare: "); 
       scanf("%d", &elimina); 
      fp=fopen("frutta.txt", "r"); 
      int trovato=0; 
      while ((!trovato) && (!feof(fp))) {  
      fread(&frutta, sizeof(struct tabella), 1, fp); 
      if (frutta.cod_prod==elimina){   
      trovato = 1;   
      frutta.cancellato=1; 
      fseek(fp, -sizeof(struct tabella), SEEK_CUR); 
      fwrite(&frutta, sizeof(struct tabella), 1, fp); 
      } 
      } 
      fclose(fp); 
      //Cancellazione fisica
      FILE *fp1, *fp2; 
      fp1=fopen("frutta.txt", "r"); 
      fp2=fopen("frutta2.txt", "w"); 
      while(!feof(fp1)){  
      fread(&frutta, sizeof(struct tabella), 1, fp);  
      if (!frutta.cancellato)   
      fwrite(&frutta, sizeof(struct tabella), 1, fp2); 
      } 
      fclose(fp1); 
      fclose(fp2); 
      remove("frutta.txt"); 
      rename("frutta2.txt","frutta.txt");
     }
     void visElemento(){
      FILE *fp;
      struct tabella frutta;
      fp=fopen("frutta.txt","r");
      
      while(fread(&frutta, sizeof (struct tabella), 1, fp)>0){
      printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
     }
      fclose(fp);
     }

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

    Ciao

    Ti posto le correzioni alla funzione cerca , e alla funzione elimina , commentate nel codice .
    L'indentazione è inesistente , e non è un bel vedere , se un insegnate vedesse codice scritto cosi'
    minimo dimezza il voto



    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct tabella{
     int cod_prod;
     char nome_prod[10];
     char tipo_prod[20];
     float prezzo;
     int cancellato;
     };
    typedef struct tabella frutta;
    void menu();
    void insElemento();
    void cercaElemento();
    void delElemento();
    void visElemento();
    int main(){
     int comando;
     do{
     menu();
     printf("\nComando:\t");
     scanf("%d", &comando);
     switch(comando){
      case 1:{
       insElemento();
       break;
      }
      case 2:{
       cercaElemento();
       break;
      }
      case 3:{
       delElemento();
       break;
      }
      case 4:{
       visElemento();
       break;
      }
     }
     }while(1);
     return 0; 
    }
    void menu(){
     printf("--------------------------");
     printf("\n1 - Inserisci Prodotto\n");
     printf("2 - Cerca Prodotto\n");
     printf("3 - Elimina Prodotto\n");
     printf("4 - Visualizza Prodotti\n");
     printf("--------------------------");
    }
    void insElemento(){
     int risp;
     FILE *fp;
     struct tabella frutta;
     fp=fopen("frutta.txt","a");
     do{
      printf("Inserisci il codice del prodotto: ");
      scanf("%d", &frutta.cod_prod);
      printf("Inserisci il nome del prodotto: ");
      scanf("%s", frutta.nome_prod);
      printf("Inserisci la tipologia del prodotto: ");
      scanf("%s", frutta.tipo_prod);
      printf("Inserisci il prezzo del prodotto: ");
      scanf("%f", &frutta.prezzo);
      fwrite (&frutta, sizeof (struct tabella), 1, fp);
      
      printf("Continuare? 1:SI - 0:NO\t");
      scanf("%d", &risp);
     }while (risp==1);
     fclose(fp);
    }
     void cercaElemento(){ //Ho provato il comando strcmp, ma di norma si dovrebbe fare con il codice.
      int search;//IL CODICE E' UN NUMERO INTERO 
      int trovato =0; //  Variabile che usiamo come simil bool 
      FILE *fp;
      struct tabella frutta;
      printf("Inserire il CODICE del prodotto da ricercare "); 
       scanf("%d",&search); 
       fp=fopen("frutta.txt", "r"); 
       while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){
       
          if ( search==frutta.cod_prod) 
          {  
               printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
               trovato=1;
          }
      //PERCHE NON FUNZIONA l'ELSE?? INFATTI MI STAMPA Elemento non trovato tante volte quanto gli elementi presenti nel file.
          
         }
         
         if(!trovato)
               printf("Elemento non trovato!\n");
             
    }
     
     
     void delElemento(){
         //Piccole modifice al codice CERCA DI CAPIRLO DA SOLO 
         
         /* La logica che hai seguito è giusta , ossia creiamo un
            file copia , che contiene tutti gli elementi i record , tranne
            quello con codice da eliminare , e sucessivamente cancelliamo
            il file di origine e rinominiamo il file destinazione, ora quello
            che hai sbagliato , e visto che la struttura il record lo devi elinare
            non ti devi preuccupare di modificarlo , a te serve solo riconscerolo 
            tramite codice prodotto */
      
     
      struct tabella frutta; 
      printf("Inserire il codice prodotto da eliminare: "); 
       scanf("%d", &elimina); 
      
      
      
      //Cancellazione fisica
      FILE *fp1, *fp2; 
      fp1=fopen("frutta.txt", "r"); 
      fp2=fopen("frutta2.txt", "w"); 
      while(!feof(fp1)){  
      fread(&frutta, sizeof(struct tabella), 1, fp1);  
      if (frutta.cod_prod!=elimina)   //Scrivo tutti i record tranne quello con codice uguale ad elimina 
      fwrite(&frutta, sizeof(struct tabella), 1, fp2); 
      } 
      fclose(fp1); 
      fclose(fp2); 
      remove("frutta.txt"); 
      rename("frutta2.txt","frutta.txt");
     }
     void visElemento(){
      FILE *fp;
      struct tabella frutta;
      fp=fopen("frutta.txt","r");
      
      while(fread(&frutta, sizeof (struct tabella), 1, fp)>0){
      printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
     }
      fclose(fp);
     }
    Tecnologia

  3. #3
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    Ti posto le correzioni alla funzione cerca , e alla funzione elimina , commentate nel codice .
    L'indentazione è inesistente , e non è un bel vedere , se un insegnate vedesse codice scritto cosi'
    minimo dimezza il voto



    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct tabella{
     int cod_prod;
     char nome_prod[10];
     char tipo_prod[20];
     float prezzo;
     int cancellato;
     };
    typedef struct tabella frutta;
    void menu();
    void insElemento();
    void cercaElemento();
    void delElemento();
    void visElemento();
    int main(){
     int comando;
     do{
     menu();
     printf("\nComando:\t");
     scanf("%d", &comando);
     switch(comando){
      case 1:{
       insElemento();
       break;
      }
      case 2:{
       cercaElemento();
       break;
      }
      case 3:{
       delElemento();
       break;
      }
      case 4:{
       visElemento();
       break;
      }
     }
     }while(1);
     return 0; 
    }
    void menu(){
     printf("--------------------------");
     printf("\n1 - Inserisci Prodotto\n");
     printf("2 - Cerca Prodotto\n");
     printf("3 - Elimina Prodotto\n");
     printf("4 - Visualizza Prodotti\n");
     printf("--------------------------");
    }
    void insElemento(){
     int risp;
     FILE *fp;
     struct tabella frutta;
     fp=fopen("frutta.txt","a");
     do{
      printf("Inserisci il codice del prodotto: ");
      scanf("%d", &frutta.cod_prod);
      printf("Inserisci il nome del prodotto: ");
      scanf("%s", frutta.nome_prod);
      printf("Inserisci la tipologia del prodotto: ");
      scanf("%s", frutta.tipo_prod);
      printf("Inserisci il prezzo del prodotto: ");
      scanf("%f", &frutta.prezzo);
      fwrite (&frutta, sizeof (struct tabella), 1, fp);
      
      printf("Continuare? 1:SI - 0:NO\t");
      scanf("%d", &risp);
     }while (risp==1);
     fclose(fp);
    }
     void cercaElemento(){ //Ho provato il comando strcmp, ma di norma si dovrebbe fare con il codice.
      int search;//IL CODICE E' UN NUMERO INTERO 
      int trovato =0; //  Variabile che usiamo come simil bool 
      FILE *fp;
      struct tabella frutta;
      printf("Inserire il CODICE del prodotto da ricercare "); 
       scanf("%d",&search); 
       fp=fopen("frutta.txt", "r"); 
       while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){
       
          if ( search==frutta.cod_prod) 
          {  
               printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
               trovato=1;
          }
      //PERCHE NON FUNZIONA l'ELSE?? INFATTI MI STAMPA Elemento non trovato tante volte quanto gli elementi presenti nel file.
          
         }
         
         if(!trovato)
               printf("Elemento non trovato!\n");
             
    }
     
     
     void delElemento(){
         //Piccole modifice al codice CERCA DI CAPIRLO DA SOLO 
         
         /* La logica che hai seguito è giusta , ossia creiamo un
            file copia , che contiene tutti gli elementi i record , tranne
            quello con codice da eliminare , e sucessivamente cancelliamo
            il file di origine e rinominiamo il file destinazione, ora quello
            che hai sbagliato , e visto che la struttura il record lo devi elinare
            non ti devi preuccupare di modificarlo , a te serve solo riconscerolo 
            tramite codice prodotto */
      
     
      struct tabella frutta; 
      printf("Inserire il codice prodotto da eliminare: "); 
       scanf("%d", &elimina); 
      
      
      
      //Cancellazione fisica
      FILE *fp1, *fp2; 
      fp1=fopen("frutta.txt", "r"); 
      fp2=fopen("frutta2.txt", "w"); 
      while(!feof(fp1)){  
      fread(&frutta, sizeof(struct tabella), 1, fp1);  
      if (frutta.cod_prod!=elimina)   //Scrivo tutti i record tranne quello con codice uguale ad elimina 
      fwrite(&frutta, sizeof(struct tabella), 1, fp2); 
      } 
      fclose(fp1); 
      fclose(fp2); 
      remove("frutta.txt"); 
      rename("frutta2.txt","frutta.txt");
     }
     void visElemento(){
      FILE *fp;
      struct tabella frutta;
      fp=fopen("frutta.txt","r");
      
      while(fread(&frutta, sizeof (struct tabella), 1, fp)>0){
      printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
     }
      fclose(fp);
     }
    Ciao Torn24, potresti farmi capire perchè nella funzione cercaElemento() alla fine metti if(!trovato){.....}? non riesco a capirlo...

    grazie

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

    Ciao

    codice:
    
    void cercaElemento(){
        int search;//IL CODICE E' UN NUMERO INTERO 
        int trovato =0;//  Variabile che usiamo come simil bool 
        FILE *fp;
        struct tabella frutta;
        printf("Inserire il CODICE del prodotto da ricercare "); 
        scanf("%d",&search); 
        fp=fopen("frutta.txt","r"); 
        while(fread(&frutta,sizeof(struct tabella),1, fp)>0){
       
            if( search==frutta.cod_prod) 
            {  
                 printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n", frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
               trovato=1;
            }
      
          
         }//End while
         
         /*Nel ciclo while , controlliamo ogni struttura-record , se troviamo il record con codice p      rodotto voluto stampiamo il record , e mettiamo a valore 1 la variabile trovato  
          se la variabile trovato==1  ho trovato il record e NON STAMPO ELEMENTO NON TROVATO
          se la variabile resta a valore 0 allora non ho stampato e non ho trovato il record.
          ========================================================================================
    
          in C , 0 = falso  , diverso da zero "in questo caso" 1 =vero , 
          (!trovato) è uguale a ! (non 1  ),non vero,  ossia uguale a zero , la condizione pertanto       la posso scrivere if(trovato==0) , di solito uso la forma più chiara , ma non so come
          mai mi è venuto di scrivere cosi :D
          */
         if(!trovato)
               printf("Elemento non trovato!\n");
             
    }
     
     
    Tecnologia

  5. #5
    Grande, funziona tutto alla perfezione!
    P.S. La prof vuole i compiti scritti sulla carta, quindi non ho problemi di indentazione! ahahah

  6. #6
    Quote Originariamente inviata da torn24 Visualizza il messaggio
    codice:
    
    void cercaElemento(){
        int search;//IL CODICE E' UN NUMERO INTERO 
        int trovato =0;//  Variabile che usiamo come simil bool 
        FILE *fp;
        struct tabella frutta;
        printf("Inserire il CODICE del prodotto da ricercare "); 
        scanf("%d",&search); 
        fp=fopen("frutta.txt","r"); 
        while(fread(&frutta,sizeof(struct tabella),1, fp)>0){
       
            if( search==frutta.cod_prod) 
            {  
                 printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n", frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
               trovato=1;
            }
      
          
         }//End while
         
         /*Nel ciclo while , controlliamo ogni struttura-record , se troviamo il record con codice p      rodotto voluto stampiamo il record , e mettiamo a valore 1 la variabile trovato  
          se la variabile trovato==1  ho trovato il record e NON STAMPO ELEMENTO NON TROVATO
          se la variabile resta a valore 0 allora non ho stampato e non ho trovato il record.
          ========================================================================================
    
          in C , 0 = falso  , diverso da zero "in questo caso" 1 =vero , 
          (!trovato) è uguale a ! (non 1  ),non vero,  ossia uguale a zero , la condizione pertanto       la posso scrivere if(trovato==0) , di solito uso la forma più chiara , ma non so come
          mai mi è venuto di scrivere cosi :D
          */
         if(!trovato)
               printf("Elemento non trovato!\n");
             
    }
     
     
    Adesso è tutto chiaro! comunque devo chiederti un altro favore... potresti dare un'occhiata alla mia ultima discussione? (quella sulla compilazione della lista di stringhe)

    grazie

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.