Visualizzazione dei risultati da 1 a 10 su 12

Visualizzazione discussione

  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

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.