Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Conteggio dati da file + minimo

    Ciao a tutti, vi disturbo in quanto ho questo problema. Devo leggere un file e memorizzarlo in una struct; il file è fatto di un numero(sconosciuto, si solo che è max 100) di questi codici:

    ABC 35
    TRF 45
    ......

    codice:
    struct dati
    {
       char lettere[4];
       int numero;
    };
    typedef struct dati autotreni;
    
    int main ()
    
    autotreni d[100];
    int i=0;
    FILE *trasporti
    
    trasporti=fopen("trasporto.txt","r");
    
    while(!feof(trasporti))
    {
        fscanf(trasporti,"%s %d", d[i].lettere,&d[i].numero);
        i++
    }
    printf("d",i);
    }
    Il risultato di i che mi stampa, corrisponde a quanti elementi (codice-numero) ci sono nel file?? Perchè dovrebbe stamparmi 4 ma mi stampa 18!Dove sbaglio?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In questa

    printf("d",i);

    non manca qualcosa?

    E poi il ciclo dovrebbe essere

    codice:
        fscanf(trasporti,"%s %d", d[i].lettere, &d[i].numero);
        while(!feof(trasporti) && i<100)
        {
            i++;
            fscanf(trasporti,"%s %d", d[i].lettere, &d[i].numero);
        }
    P.S. Perchè hai inviato questo messaggio 3 VOLTE?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Perchè ci vuole la fscanf anche prima del while?
    Comunque mi è venuta in mente una cosa, se io devo leggere semplicemente il numero dal file e devo vedere se è maggiore o meno di uno inserito dall'utente e trovare il minimo di quelli maggiori, posso anche non salvare tutto ma prendere quello maggiore, salvarlo, confrontarlo con quelli già salvati e nel caso risulti più piccolo, aggiornare il valore?così poi da riuscire a trovare il minimo tra essi??...se nel caso per capire meglio volete il testo del programma ve lo scrivo. Grazie

  4. #4
    Questo è il testo:

    Una ditta di trasporti dispone di un certo numero di autocarri(massimo 100).
    I codici degli autocarri sono elencati in un file che in ogni riga contiene:
    Il codice dell'autocarro(su tre caratteri)
    la sua portata in tonnellate

    esempio:
    FRT 35
    GHD 24
    SWZ 12
    TES 17
    VCD 26

    Si scriva un programma che richieda all'utente il peso della spedizione da effettuare e scegla con quali autocarri effettuare la spedizione. Viene dapprima controllato se è possibile effettuare la spedizione con un solo autocarro.In questo viene scelto l'autocarro con la portata minima tra quelli possibili.
    Se questo non è possibile, viene esaminato se è possibile effettuare la spedizione con due autocarri. Viene poi stampato a video il codice dell'autocarro utilizzato.
    Si passa poi all'introduzione del carico della spedizione successiva. Il programma termina quando non è possibile trovare una soluzione per la spedizione richiesta.

    Io ho scritto questo main (mancano le funzioni ancora e tutti i controlli di fine programma):

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAX 100
    
    struct dati
    {
        char codice[4];
        int portata;
    };
    typedef struct dati codiceautocarro;
    
    void spedizione_autocarro_singolo();
    void spedizione_due_autocarri();
    
    int main()
    {
        FILE *autocarri;
        int pesospedizione=0,portatatemp=0;
        char codicetemp[4];
    
        autocarri=fopen("codice.txt","r");
        if(autocarri==NULL)
        {
            printf("\n\nErrore nell'apertura del file\n\n");
            exit(1);
        }
        printf("\nInserire il peso della prossima spedizione da effettuare >");
        scanf("%d",&pesospedizione);
        while(!feof(autocarri))
        {
            fscanf(autocarri,"%s %d", codicetemp, &portatatemp);
            if(portatatemp>=pesospedizione)
               spedizione_autocarro_singolo();
            else
               spedizione_due_autocarri();
        }
    return 0;
    }
    Mi conviene fare il tutto con un aggiornamento delle variabili temp senza salvare nulla, o è più semplice salvare tutto il file nella struttura dati?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La fscanf va prima perchè la feof diventa valutabile solamente dopo la fscanf.

    In caso contrario (così come hai scritto ancora nell'ultimo post) viene fatta una lettura in piu' dopo la fine del file.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Ho fatto come mi hai detto, poi volevo fare un controllo se mi teneva il conto di quante righe c'erano ma il risultato è questo:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAX 100
    
    struct dati
    {
        char codice[4];
        int portata;
    };
    typedef struct dati codiceautocarro;
    
    //void spedizione_autocarro_singolo();
    //void spedizione_due_autocarri();
    
    int main()
    {
        FILE *autocarri;
        int pesospedizione=0,portatatemp=0,i=0;
        char codicetemp[4];
        codiceautocarro a[MAX];
    
        autocarri=fopen("codice.txt","r");
        if(autocarri==NULL)
        {
            printf("\n\nErrore nell'apertura del file\n\n");
            exit(1);
        }
        printf("\nInserire il peso della prossima spedizione da effettuare >");
        scanf("%d",&pesospedizione);
    
        fscanf(autocarri,"%s %d", a[i].codice, &a[i].portata);
        while(!feof(autocarri) && i<MAX)
        {
            i++;
            fscanf(autocarri,"%s %d", a[i].codice, &a[i].portata);
        }
        printf("%d", i);
            /*if(portatatemp>=pesospedizione)
               spedizione_autocarro_singolo();
            else
               spedizione_due_autocarri();*/
    
    return 0;
    }

    mi stampa 17!!Ma il mio file è:

    FRT 35
    GHD 24
    SWZ 12
    TES 17
    VCD 26

    dovrebbe stampare 5...dove sbaglio?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    A me stampa correttamente 5

    Si vede che tu hai un file con delle linee vuote alla fine ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Ho già provato a ricreare il file....

    cmq ho migliorato le cose:

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAX 100
    
    struct dati
    {
        char codice[4];
        int portata;
    };
    typedef struct dati codiceautocarro;
    
    
    int main()
    {
        FILE *autocarri;
        int pesospedizione=0,i=0;
        codiceautocarro a[MAX];
    
        autocarri=fopen("codice.txt","r");
        if(autocarri==NULL)
        {
            printf("\n\nErrore nell'apertura del file\n\n");
            exit(1);
        }
        printf("\nInserire il peso della prossima spedizione da effettuare >");
        scanf("%d",&pesospedizione);
    
        while (fscanf (autocarri, "%s %d", a[i].codice,&a[i].portata)!=EOF && i < MAX)
        {
            fscanf(autocarri, "%s %d", a[i].codice,&a[i].portata);
            i++;
        }
        printf("Sono stati letti %d autocarri\n",i);
    
    
        fclose(autocarri);
    return 0;
    }
    ora mi stampa 10 invece di 5....e se aggiungo una riga al file mi stampa 11....quindi ne legge 5 in più di default!L'unico problema potrebbe essere il file?Io ho un mac, scrivo su textedit e poi converto in txt, può essere quello il problema?

  9. #9
    o provato a fare il txt con windows e ora invece che 5....me ne legge 3!è un incuboooo

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da zionico90
    ho provato ...
    Guarda ... io ne ho fatto 5 e ne legge 5 ... per il resto non so cosa tu stia facendo, ma non è un problema di programmazione ...
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.