Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113

    [C] Problema file ad accesso sequenziale

    Ciao a tutti. Ho fatto questo programmino per la creazione di un file e successivamente per ordinarlo in snso decresente in base al campo "Invitati"
    codice:
    #include <stdio.h>
    #include <string.h>
    #define n 10
    
    struct matrimonio {
            char Cognome_Sposo[15];
            char Cognome_Sposa[15];
            int Data;
            int Invitati;
    }matri[n];
    
    int main()
    {
        char sposo[15];
        char sposa[15];
        int data;
        int invitati;
        int j;
        int i = 0;
        char app[15];
        int appo;
    
        FILE *cfPtr;   /* puntatore al file eventi.dat */
    
        /* fopen apre il file in lettura/scrittura; se non riesce ad aprirlo provoca l'uscita dal programma */
    
        if (( cfPtr = fopen("eventi.dat", "w")) == NULL ) {
                printf("Il file non può essere aperto.\n");
        } else {
            printf("Inserisci il cognome dello sposo, il cognome della sposa, la data e il numero di invitati : \n");
            printf("Inserisci EOF per terminare l'inserimento \n");
            scanf("%s%s%d%d", sposo, sposa, &data, &invitati );
    
    
            /* scrive i dati nel file con fprintf */
    
            while (!feof(stdin)) {      /* stdin punta al file e la funzione feof controlla l'impostazione di EOF */
                fprintf(cfPtr, "%s %s %d %d\n", sposo, sposa, data, invitati);
                scanf("%s%s%d%d", sposo, sposa, &data, &invitati);
            } /* end while */
    
            fclose(cfPtr);
    
        } /* end else */
    
        /* fopen apre il file in lettura; se non riesce ad aprire il file provoca l'uscita dal programma */
    
        if (( cfPtr = fopen("eventi.dat", "r")) == NULL ) {
            printf("Il file non può essere aperto \n");
        } else {
    
            fscanf(cfPtr, "%s %s %d %d", sposo, sposa, &data, &invitati);
            strcpy(matri[i].Cognome_Sposo, sposo);
            strcpy(matri[i].Cognome_Sposa, sposa);
            matri[i].Data = data;
            matri[i].Invitati = invitati;
            i++;
            while (!feof(cfPtr)) {
                fscanf(cfPtr, "%s %s %d %d", sposo, sposa, &data, &invitati);
                strcpy(matri[i].Cognome_Sposo, sposo);
                strcpy(matri[i].Cognome_Sposa, sposa);
                matri[i].Data = data;
                matri[i].Invitati = invitati;
                i++;
            } /* end while */
    
         fclose(cfPtr);
    
        } /* end else */
        printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n");
        for ( j = 0; j < i - 1; j++ ) {
            printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati);
            printf("\n");
        }
    
        for ( j = 0; j < i; j++ ) {
            if (matri[j].Invitati < matri[j+1].Invitati ) {
                strcpy(app, matri[j].Cognome_Sposo);
                strcpy(matri[j].Cognome_Sposo, matri[j+1].Cognome_Sposo);
                strcpy(matri[j+1].Cognome_Sposo, app);
                strcpy(app, matri[j].Cognome_Sposa);
                strcpy(matri[j].Cognome_Sposa, matri[j+1].Cognome_Sposa);
                strcpy(matri[j+1].Cognome_Sposa, app);
                appo = matri[j].Data;
                matri[j].Data = matri[j+1].Data;
                matri[j+1].Data = appo;
                appo = matri[j].Invitati;
                matri[j].Invitati = matri[j+1].Invitati;
                matri[j+1].Invitati = appo;
            }
        }
        printf("MATRIMONI ORDINATI IN SENSO DECRESCENTE IN BASE AL NUMERO DI IVNITATI\n");
        printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n");
        for ( j = 0; j < i; j++ ) {
            printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati);
            printf("\n");
        }
    
    
        return 0;
    }
    Ho due problemi:
    1. sugli indici per il ciclo for per la visualizzazione
    codice:
    printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n");
        for ( j = 0; j < i - 1; j++ ) {
            printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati);
            printf("\n");
        }
    quando vado a scrivere il file arrivo ad un determinato "i". quindi di norma per la visualizzazione j dovrebbe andare da j = 0 a j < i ma se faccio così l'ultimo elemento me lo visualizza 2 volte e quindi ho messo "i - 1"..ma non capisco il perchè???



    NON RIESCO A CAPIRNE IL MOTIVO..per favore qualcuno può aiutami??? Grazieee
    Ultima modifica di sizeof; 07-10-2013 a 20:54

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Succede perché fai i++ subito prima di uscire dal ciclo. Quindi i dati inseriti sono i-1
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    ma nel file file io metto 3 record. allora i = 0 : primo record, i = 1 : secondo record; i = 2 terzo record; i= 3 trovo EOF.
    quindi dovrei andare da j = 0 a j < 3...perchè invece devo andare da 0 a 2 leggendo solo 0, 1 ????

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prova a visualizzare i dopo la prima fclose.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    hai perfettamente ragione se nel file ho 3 record la i = 4.
    ma quindi anche se trova EOF cicla ancora ed incremente di nuovo la i ?????

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non hai capito ... non c'è un ciclo in più ... la i++ è eseguita prima del controllo quindi viene comunque eseguita prima che termini il ciclo.

    Prova ad invertire le due righe

    codice:
    i++;
    while(!feof(cfPtr)){
    


    in questo modo

    codice:
    while (!feof(cfPtr)) {
       i++;
    


    ed elimina la i++ che sta alla fine del ciclo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Si fatto..esatto! Grazie!!!
    Però ora ho un problema per quanto riguarda il ciclo per mettere in ordine decrescente.
    codice:
    for ( j = 0; j < i ; j++ ) {
            if (matri[j].Invitati < matri[j+1].Invitati ) {
                strcpy(app, matri[j].Cognome_Sposo);
                strcpy(matri[j].Cognome_Sposo, matri[j+1].Cognome_Sposo);
                strcpy(matri[j+1].Cognome_Sposo, app);
                strcpy(app, matri[j].Cognome_Sposa);
                strcpy(matri[j].Cognome_Sposa, matri[j+1].Cognome_Sposa);
                strcpy(matri[j+1].Cognome_Sposa, app);
                appo = matri[j].Data;
                matri[j].Data = matri[j+1].Data;
                matri[j+1].Data = appo;
                appo = matri[j].Invitati;
                matri[j].Invitati = matri[j+1].Invitati;
                matri[j+1].Invitati = appo;
            }
        }
        printf("%d", j);
        printf("MATRIMONI ORDINATI IN SENSO DECRESCENTE IN BASE AL NUMERO DI IVNITATI\n");
        printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n");
        for ( j = 0; j < i; j++ ) {
            printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati);
            printf("\n");
        }
    Noto che se inserisco ad esempio 4 record . nella fase di stampa sembra che non vada a considerarmi il 3 record stampandomi invece l'ultimo per ben 2 volte.....per quale motivo???

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma che tipo di algoritmo di ordinamento hai usato ? Come mai un solo ciclo ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    Ho rifatto l'algoritmo di ordinamento utilizzando il selection sort
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define n 10
    
    struct matrimonio {
            char Cognome_Sposo[15];
            char Cognome_Sposa[15];
            int Data;
            int Invitati;
    }matri[n];
    
    int main()
    {
        char sposo[15];
        char sposa[15];
        int data;
        int invitati;
        int j, k;
        int i = 0;
        char app[15];
        int appo;
    
        FILE *cfPtr;   /* puntatore al file eventi.dat */
    
        /* fopen apre il file in lettura/scrittura; se non riesce ad aprirlo provoca l'uscita dal programma */
    
        if (( cfPtr = fopen("eventi.dat", "w")) == NULL ) {
                printf("Il file non può essere aperto.\n");
        } else {
            printf("Inserisci il cognome dello sposo, il cognome della sposa, la data e il numero di invitati : \n");
            printf("Inserisci EOF per terminare l'inserimento \n");
            scanf("%s%s%d%d", sposo, sposa, &data, &invitati );
    
    
            /* scrive i dati nel file con fprintf */
    
            while (!feof(stdin)) {      /* stdin punta al file e la funzione feof controlla l'impostazione di EOF */
                fprintf(cfPtr, "%s %s %d %d\n", sposo, sposa, data, invitati);
                scanf("%s%s%d%d", sposo, sposa, &data, &invitati);
            } /* end while */
    
            fclose(cfPtr);
    
        } /* end else */
    
        /* fopen apre il file in lettura; se non riesce ad aprire il file provoca l'uscita dal programma */
    
        if (( cfPtr = fopen("eventi.dat", "r")) == NULL ) {
            printf("Il file non può essere aperto \n");
        } else {
    
            fscanf(cfPtr, "%s %s %d %d", sposo, sposa, &data, &invitati);
            strcpy(matri[i].Cognome_Sposo, sposo);
            strcpy(matri[i].Cognome_Sposa, sposa);
            matri[i].Data = data;
            matri[i].Invitati = invitati;
            while (!feof(cfPtr)) {
                i++;
                fscanf(cfPtr, "%s %s %d %d", sposo, sposa, &data, &invitati);
                strcpy(matri[i].Cognome_Sposo, sposo);
                strcpy(matri[i].Cognome_Sposa, sposa);
                matri[i].Data = data;
                matri[i].Invitati = invitati;
            } /* end while */
    
         fclose(cfPtr);
        } /* end else */
        printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n");
        for ( j = 0; j < i; j++ ) {
            printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati);
            printf("\n");
        }
    
        for ( j = 0; j < i - 1 ; j++ ) {
            for ( k = i + 1; k < i; k++ ) {
                if (matri[j].Invitati < matri[k].Invitati ) {
                    strcpy(app, matri[j].Cognome_Sposo);
                    strcpy(matri[j].Cognome_Sposo, matri[k].Cognome_Sposo);
                    strcpy(matri[k].Cognome_Sposo, app);
                    strcpy(app, matri[j].Cognome_Sposa);
                    strcpy(matri[j].Cognome_Sposa, matri[k].Cognome_Sposa);
                    strcpy(matri[k].Cognome_Sposa, app);
                    appo = matri[j].Data;
                    matri[j].Data = matri[k].Data;
                    matri[k].Data = appo;
                    appo = matri[j].Invitati;
                    matri[j].Invitati = matri[k].Invitati;
                    matri[k].Invitati = appo;
                }
            }
        }
    printf("%d", i);
    printf("%d", j);
        printf("\nMATRIMONI ORDINATI IN SENSO DECRESCENTE IN BASE AL NUMERO DI IVNITATI\n");
        printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n");
        for ( j = 0; j < i; j++ ) {
            printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati);
            printf("\n");
        }
    
    
        return 0;
    }
    Qualcuno sa dirmi perchè mi stampa la struttura senza ordinarmela..non riesco proprio a capire questa cosa.
    Faccio eseguire l'algoritmo di ordinamento ma quando vado a stampare non mi ha ordinato proprio nulla!!!!!!

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    codice:
        
            for ( k = j + 1; k < i; k++ ) {
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Tag per questa discussione

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.