Controlla le modifiche in tanto. Il programma non si blocca, non si esegue l'else ma poi prossegue con l'ordinamento di qualcosa che non ha letto, poi alla chiusura di un file inesistente. E' così complicato per te seguire le righe e vedere cosa fa un programma e come prossegue la sua esecuzione in caso di casi imprevisti?
#include <stdio.h>
#include <string.h>
#define MAX_DIM 20
struct studenti
{
char nome [10];
char cognome [10];
int voto;
};
int leggi_file (FILE*, struct studenti*);
void ordina_alfabetico_cognome (struct studenti*, int);
void ordina_voto (struct studenti*, int);
void salva_su_file (FILE *, struct studenti*, int);
int main()
{
FILE *fo, *fr;
struct studenti classe [MAX_DIM];
int N=0, i;
fo = fopen ("oggi.txt", "r");
if(fo==NULL)
{
printf ("Il file è inesistente");
return 0;
}
else
{
N= leggi_file (fo, classe);
fclose (fo);
}
ordina_alfabetico_cognome (classe, N);
for (i=0; i<N; i++)
{
printf ("i cognomi sono: %s\n", classe[i].cognome);
for (i=0; i<N; i++)
{
printf ("che voto vuoi dare al signore: %s %s\n", classe[i].nome, classe[i].cognome);
scanf ("%d", &classe[i].voto);
}
}
ordina_voto (classe,N);
fr= fopen ("risultati.txt", "w");
if (fr!=NULL)
{
salva_su_file (fr, classe, N);
fclose (fr);
}
}
int leggi_file (FILE*f, struct studenti*A)
{
int i=0;
while(fscanf(f, "%s %s", A[i].nome, A[i].cognome)!=EOF)
i++;
return(i);
}
void ordina_alfabetico_cognome (struct studenti*A, int dim)
{
int i, j, imin, test;
struct studenti temp;
for (i=0; i<dim-1;i++)
{
imin = i;
for (j=0; j<dim; j++)
{
test = strcmp(A[j].cognome, A[imin].cognome);
if (test<0)
imin = j;
}
temp = A[i];
A[i] = A[imin];
A[imin] = temp;
}
}
void ordina_voto (struct studenti*A, int n)
{
int i, j, imax;
struct studenti temp;
for (i=0; i<n; i++)
{
imax = i;
for (j=i+1; j<n; j++)
{
if(A[j].voto > A[imax].voto)
{
imax = j;
}
temp = A[i];
A[i] = A[imax];
A[imax] = temp;
}
}
}
void salva_su_file (FILE*g, struct studenti*A, int n)
{
int i;
for (i=0; i<n; i++)
{
fprintf (g,"%s %s %d", A[i].cognome, A[i].nome,A[i].voto);
}
}