PDA

Visualizza la versione completa : [C] Problema file ad accesso sequenziale


sizeof
07-10-2013, 20:47
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"


#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


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

oregon
07-10-2013, 21:09
Succede perché fai i++ subito prima di uscire dal ciclo. Quindi i dati inseriti sono i-1

sizeof
07-10-2013, 21:23
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 ????

oregon
07-10-2013, 21:25
Prova a visualizzare i dopo la prima fclose.

sizeof
07-10-2013, 21:36
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 ?????

oregon
07-10-2013, 22:00
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



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


in questo modo




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


ed elimina la i++ che sta alla fine del ciclo.

sizeof
08-10-2013, 10:50
Si fatto..esatto! Grazie!!!
Però ora ho un problema per quanto riguarda il ciclo per mettere in ordine decrescente.


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???

oregon
08-10-2013, 11:15
Ma che tipo di algoritmo di ordinamento hai usato ? Come mai un solo ciclo ?

sizeof
08-10-2013, 18:44
Ho rifatto l'algoritmo di ordinamento utilizzando il selection sort


#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!!!!!!

oregon
08-10-2013, 19:14
for ( k = j + 1; k < i; k++ ) {

Loading