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

    [C]Problema con i file

    Salve ragazzi ho questo problema: il programma creato fa il suo dovere ma va in loop quando deve stampare delle informazioni. Di seguito posto il codice:
    codice:
    #include <stdio.h>
    #include <string.h>
    void scrivi();
    void cerca();
    struct azienda{
           char nome[20];
           char cognome[20];
           int stipendio;
           int eta;
           }dipendente;
    FILE *p;
    char r,nome1[20];
    int main(int argc,char*argv[]){
        scrivi();
        cerca();
        system ("pause");
        return 0;
                                   }
    
    void scrivi(){
        p=fopen("Dipendente.txt","w");
        if(p!=NULL)
        {
    
          do
          {
            printf("Inserire nome: ");
            scanf("%s",&dipendente.nome);
            printf("Inserire cognome: ");
            scanf("%s",&dipendente.cognome);
            printf("Inserire stipendio: ");
            scanf("%d",&dipendente.stipendio);
            printf("Inserire eta': ");
            scanf("%d",&dipendente.eta);
            fprintf(p,"% s % s % d % d \n",dipendente.nome,dipendente.cognome,dipendente.stipendio,dipendente.eta);
           do
            {
              printf("Si vuole uscire dall'inserimento?");
              scanf("%s",&r);
    
            }while(r!='n' && r!='s');
          }while(r=='n');
          fclose(p);
          }
          else{
               printf("Errore");
          }
          }
          
    void cerca(){
                  p=fopen("Dipendente.txt","r");
         if(p!=NULL){
                     printf("Inserire nome del dipendente da cercare: ");
                     scanf("%s",&nome1);
                     fscanf(p,"% s % s % d % d \n",dipendente.nome,dipendente.cognome,dipendente.stipendio,dipendente.eta);
         while(!feof(p)){
                        if(!strcmp(nome1,dipendente.nome)){
                                                          printf("Il dipendente %s %s\n ha reddito di %d\n di eta' %d\n ",dipendente.nome,dipendente.cognome,dipendente.stipendio,dipendente.eta);
                                                          }
                        
                        fscanf(p,"% s % s % d % d \n",dipendente.nome,dipendente.cognome,dipendente.stipendio,dipendente.eta);
                        }
         fclose(p);
         }
         else{
              printf("Errore");
              }
                }
    Aiutatemi

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Per stampare delle informazioni intendi la funzione cerca()?

  3. #3
    si, anche se non è propio ideale come nome...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Stai usando male le scanf() e le fscanf().

    Quando leggi una stringa non hai bisogno di anteporre l'operatore & alla variabile stringa, questo perché di per sé una variabile del genere è già un indirizzo. Inoltre elimina gli spazi nei codici di formato: perché scrivi "% s" e non semplicemente "%s" ad esempio? Anche il "\n" in quel modo nella scanf() non ha utilità.

    Considera poi che, quando leggi i dati da file, ai parametri "dipendente.stipendio" e "dipendente.eta" devi anteporre la & perché devi passarne l'indirizzo (è esattamente l'errore opposto a quello che commetti altrove per le stringhe).

    Riscriverei così (apportando le modifiche minime):

    codice:
    printf("Inserire nome del dipendente da cercare: ");
    scanf("%s", nome1);
    fscanf(p,"%s %s %d %d", dipendente.nome, dipendente.cognome, &dipendente.stipendio, &dipendente.eta);
    while (!feof(p)) {
        if (!strcmp(nome1,dipendente.nome)) {
            printf("Il dipendente %s %s\n ha reddito di %d\n di eta' %d\n ", dipendente.nome, dipendente.cognome, dipendente.stipendio, dipendente.eta);
            fscanf(p,"%s %s %d %d", dipendente.nome, dipendente.cognome, &dipendente.stipendio, &dipendente.eta);
        }
        fclose(p);
    }
    l'errore della & per le stringhe nelle scanf() è presente comunque anche altrove.
    every day above ground is a good one

  5. #5
    a questo punto per confondermi sarebbe meglio sostituire scanf con gets?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da caos-zero
    sostituire scanf con gets?
    Risolveresti *quel* problema ma ne introdurresti un altro ben più grave di sicurezza e affidabilità: la gets() è ufficialmente deprecata, questo perché non esegue alcun controllo sulla dimensione del buffer in cui va a scrivere dando quindi adito a buffer overflow. In realtà lo stesso problema si ha anche con la scanf() e il codice di formato %s, per quanto in quel caso ci siano alcuni work-around.

    Puoi comunque ricorrere alla fgets(), generalizzazione di gets() per la lettura da input file stream (quindi anche da stdin) e buffer safe.
    every day above ground is a good one

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.