29/06/12 17:01
nicspa92
Sto provando a fare un programma in c: leggere da un file come sotto
numero matricole
matricola
numero esami
esame1 voto1
esame2 voto2
matricola
numero esami
esame1 voto1
..
memorizzaro su apposita struttura, ecc. Io ho fatto questo :
/*
Leggere da file una struttura dati matricole ed esami
Il file ha la seguente struttura:
<numero matricole>
<matricola>
<numero esami>
<esame> <descrizione esame> <voto esame>
<esame> <descrizione esame> <voto esame>
..
<matricola>
<numero esami>
<esame> <descrizione esame> <voto esame>
..
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cstdlib>
#include <iostream>
#define MAX_CHARS 100
using namespace std;
/* Data structure matricole */
typedef struct matricole matricole_t;
struct matricole
{
char * matricola;
int nEsami;
} ;
/* Inizializza data structure matricole */
matricole_t * init_matricole( const unsigned size);
/* Data structure esami */
typedef struct esami esami_t;
struct esami
{
char * matricola;
char * esame;
char * nomeEsame;
int votoEsame;
} ;
/* Inizializza data structure esami */
esami_t * init_esami( const unsigned size );
/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole );
void free_esami( esami_t *esami);
/* Main */
main()
{
FILE *fileptr;
char buffer[ MAX_CHARS ];
int nMatricole;
int lMatricole;
char matricola[ MAX_CHARS ];
int nEsami;
char esame[ MAX_CHARS ];
char nomeEsame[ MAX_CHARS ];
int votoEsame;
int pM;
int pE;
int n;
matricole_t *matricole = NULL;
esami_t *esami = NULL;
printf( "Nome del file? " );
scanf( "%s", buffer );
fileptr = fopen( buffer, "rt" );
if (fileptr == NULL)
{
printf ( "Errore durante l' apertura del file richiesto.\n" );
system("PAUSE"
return 0;
}
pM = 0;
pE = 0;
n = 0;
nMatricole = 0;
fscanf( fileptr, "%d", &nMatricole );
printf ("Numero matricole: %d\n", nMatricole);
n++;
for (int y=0; y < nMatricole; y++)
{
fscanf( fileptr, "%s", &matricola);
printf ("Matricola: %s\n", matricola);
nEsami = 0;
fscanf( fileptr, "%d", &nEsami );
printf ("Numero esami: %d\n", nEsami);
matricole = (matricole_t *)realloc(matricole,sizeof(matricole_t)*n);
matricole[pM].matricola = strdup(matricola);
matricole[pM].nEsami = nEsami;
pM++;
for (int i=0; i < nEsami; i++)
{
fscanf( fileptr, "%s %s %d", &esame , &nomeEsame , &votoEsame );
printf ("%s %s %s %d %d\n", matricola, esame, nomeEsame, votoEsame, pE);
esami = (esami_t *)realloc(esami,sizeof(esami_t)*n);
esami[pE].matricola = strdup(matricola);
esami[pE].esame = strdup(esame);
esami[pE].nomeEsame = strdup(nomeEsame);
esami[pE].votoEsame = votoEsame;
pE++;
}
}
fclose( fileptr );
int scelta;
for(;
{
/* Menu operazioni disponibili */
printf("\nGestione di un file contenente studenti ed esami\n"
printf("\n1) Visualizza dati"
printf("\n2) Visualizza esami matricola"
printf("\n3) .."
printf("\n4) .."
printf("\n0) Fine elebaorazione\n"
printf("\nScelta operazione (1..4,0) "
scanf("%d",&scelta);
while(!getchar()=='\n');
if(!scelta)
break;
/* Richiama funzione scelta */
switch(scelta)
{
case 1:
for (int i=0; i != pM; i++)
{
printf ("Matricola: %s %d\n", matricole[i].matricola, matricole[i].nEsami);
}
for (int y=0; y != pE ; y++)
{
printf ("%s %s %s %d \n", esami[y].matricola, esami[y].esame, esami[y].nomeEsame, esami[y].votoEsame);
}
break;
case 2:
printf( "Quale matricola? " );
scanf( "%s", &matricola );
for (int y=0; y != pE ; y++)
{
if (esami[y].matricola = matricola)
printf ("%s %s %s %d\n", esami[y].matricola ,esami[y].esame, esami[y].nomeEsame, esami[y],votoEsame);
}
break;
free_matricole (matricole);
free_esami (esami);
}
}
}
/* Inizializza la struttura dati */
matricole_t * init_matricole( const unsigned size )
{
matricole_t *matricole = (matricole_t *) malloc( size * sizeof(matricole_t) );
if( matricole == NULL )
return NULL;
return matricole;
}
/* Inizializza la struttura dati */
esami_t * init_esami( const unsigned size )
{
esami_t *esami = (esami_t *) malloc( size * sizeof(esami_t) );
if( esami == NULL )
return NULL;
return esami;
}
/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole )
{
if( matricole != NULL )
free( matricole );
}
/* Rilascia la memoria allocata per la struttura dati */
void free_esami( esami_t *esami )
{
if( esami != NULL )
free( esami );
}
Quando visualizzo le strutture separate vanno bene, ma se voglio gli esami di una matricola li visualizza tutti. Perche ???????
numero matricole
matricola
numero esami
esame1 voto1
esame2 voto2
matricola
numero esami
esame1 voto1
..
memorizzaro su apposita struttura, ecc. Io ho fatto questo :
/*
Leggere da file una struttura dati matricole ed esami
Il file ha la seguente struttura:
<numero matricole>
<matricola>
<numero esami>
<esame> <descrizione esame> <voto esame>
<esame> <descrizione esame> <voto esame>
..
<matricola>
<numero esami>
<esame> <descrizione esame> <voto esame>
..
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cstdlib>
#include <iostream>
#define MAX_CHARS 100
using namespace std;
/* Data structure matricole */
typedef struct matricole matricole_t;
struct matricole
{
char * matricola;
int nEsami;
} ;
/* Inizializza data structure matricole */
matricole_t * init_matricole( const unsigned size);
/* Data structure esami */
typedef struct esami esami_t;
struct esami
{
char * matricola;
char * esame;
char * nomeEsame;
int votoEsame;
} ;
/* Inizializza data structure esami */
esami_t * init_esami( const unsigned size );
/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole );
void free_esami( esami_t *esami);
/* Main */
main()
{
FILE *fileptr;
char buffer[ MAX_CHARS ];
int nMatricole;
int lMatricole;
char matricola[ MAX_CHARS ];
int nEsami;
char esame[ MAX_CHARS ];
char nomeEsame[ MAX_CHARS ];
int votoEsame;
int pM;
int pE;
int n;
matricole_t *matricole = NULL;
esami_t *esami = NULL;
printf( "Nome del file? " );
scanf( "%s", buffer );
fileptr = fopen( buffer, "rt" );
if (fileptr == NULL)
{
printf ( "Errore durante l' apertura del file richiesto.\n" );
system("PAUSE"
return 0;
}
pM = 0;
pE = 0;
n = 0;
nMatricole = 0;
fscanf( fileptr, "%d", &nMatricole );
printf ("Numero matricole: %d\n", nMatricole);
n++;
for (int y=0; y < nMatricole; y++)
{
fscanf( fileptr, "%s", &matricola);
printf ("Matricola: %s\n", matricola);
nEsami = 0;
fscanf( fileptr, "%d", &nEsami );
printf ("Numero esami: %d\n", nEsami);
matricole = (matricole_t *)realloc(matricole,sizeof(matricole_t)*n);
matricole[pM].matricola = strdup(matricola);
matricole[pM].nEsami = nEsami;
pM++;
for (int i=0; i < nEsami; i++)
{
fscanf( fileptr, "%s %s %d", &esame , &nomeEsame , &votoEsame );
printf ("%s %s %s %d %d\n", matricola, esame, nomeEsame, votoEsame, pE);
esami = (esami_t *)realloc(esami,sizeof(esami_t)*n);
esami[pE].matricola = strdup(matricola);
esami[pE].esame = strdup(esame);
esami[pE].nomeEsame = strdup(nomeEsame);
esami[pE].votoEsame = votoEsame;
pE++;
}
}
fclose( fileptr );
int scelta;
for(;
{
/* Menu operazioni disponibili */
printf("\nGestione di un file contenente studenti ed esami\n"
printf("\n1) Visualizza dati"
printf("\n2) Visualizza esami matricola"
printf("\n3) .."
printf("\n4) .."
printf("\n0) Fine elebaorazione\n"
printf("\nScelta operazione (1..4,0) "
scanf("%d",&scelta);
while(!getchar()=='\n');
if(!scelta)
break;
/* Richiama funzione scelta */
switch(scelta)
{
case 1:
for (int i=0; i != pM; i++)
{
printf ("Matricola: %s %d\n", matricole[i].matricola, matricole[i].nEsami);
}
for (int y=0; y != pE ; y++)
{
printf ("%s %s %s %d \n", esami[y].matricola, esami[y].esame, esami[y].nomeEsame, esami[y].votoEsame);
}
break;
case 2:
printf( "Quale matricola? " );
scanf( "%s", &matricola );
for (int y=0; y != pE ; y++)
{
if (esami[y].matricola = matricola)
printf ("%s %s %s %d\n", esami[y].matricola ,esami[y].esame, esami[y].nomeEsame, esami[y],votoEsame);
}
break;
free_matricole (matricole);
free_esami (esami);
}
}
}
/* Inizializza la struttura dati */
matricole_t * init_matricole( const unsigned size )
{
matricole_t *matricole = (matricole_t *) malloc( size * sizeof(matricole_t) );
if( matricole == NULL )
return NULL;
return matricole;
}
/* Inizializza la struttura dati */
esami_t * init_esami( const unsigned size )
{
esami_t *esami = (esami_t *) malloc( size * sizeof(esami_t) );
if( esami == NULL )
return NULL;
return esami;
}
/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole )
{
if( matricole != NULL )
free( matricole );
}
/* Rilascia la memoria allocata per la struttura dati */
void free_esami( esami_t *esami )
{
if( esami != NULL )
free( esami );
}
Quando visualizzo le strutture separate vanno bene, ma se voglio gli esami di una matricola li visualizza tutti. Perche ???????
aaa