Sono riuscito a farlo andare grazie mille... comunque la tua versione del programma mi è piaciuta, ho modificato un paio di cose in base a quella, ma il secondo ciclo (quello do-while) l'ho lasciato invariato ed ha funzionato lo stesso (infatti ero abbastanza sicuro che fosse giusto anche come avevo fatto io)... la cosa principalmente che non lo faceva andare era:
while (c!=EOF){
fscanf(ptrFile,"%d %d%c", &voto[i], &pes[i], &c);
che ho sostituito come ho visto nella tua versione con:
if ((ptrFile=fopen("Voti.txt","r+"))==NULL){printf("Impossibile aprire il file\n"); return(-1);}
poi ho tolto il buffer di overflow dalla s come mi hai suggerito e modificato un paio di cose per quanto riguarda la i, in particolare tra i due cicli ho messo l'istruzione:
i=i-1;
per il problema che avevo evidenziato sopra e poi conseguentemente nella funzione ho messo:
mediap=MediaPesata(pes,voto,i+1);
Poi ho modificato un altro dettaglio nell'fprintf mettendo uno spazio prima del primo %d se no mi scriveva il voto digitato attaccato al peso del voto prima, ora l'ho modificato così:
fprintf(ptrFile," %d %d",voto[i], pes[i]);
Quindi ho fatto varie prove e funziona, grazie infinite per il fondamentale aiuto, lascio qui anche la mia versione funzionante con il secondo ciclo pressochè inalterato (non ho messo il ciclo per mostrare i voti come hai fatto tu ma in effetti può fare comodo...).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
float MediaPesata(int [], int [], int); //dichiarazione funzione
float MediaPesata(int peso[], int numero[],int N) //funzione generica che calcola la media
{
int i,s,a;
float media;
a=0;
s=0;
for (i=0; i<N; i++){
s=s+numero[i]*peso[i];
a=a+peso[i];
}
media=(float)(s)/(float)(a);
return(media);
}
int main()
{
FILE *ptrFile;
float mediap;
int i,N,*pes,*voto;
char c,s[80];
if ((ptrFile=fopen("Voti.txt","r+"))==NULL){printf("Impossibile aprire il file\n"); return(-1);}
if ((pes=(int*)malloc(sizeof(int)))==NULL){
printf("Impossibile allocare la memoria\n"); return(-1);}
if ((voto=(int*)malloc(sizeof(int)))==NULL){
printf("Impossibile allocare la memoria\n"); return(-1);}
i=0;
while ( (fscanf(ptrFile,"%d %d ", &voto[i],&pes[i])) != EOF){
i++;
if ((pes=(int*)realloc(pes,(i+1)*sizeof(int)))==NULL){
printf("Impossibile allocare la memoria\n"); return(-1);}
if ((voto=(int*)realloc(voto,(i+1)*sizeof(int)))==NULL){
printf("Impossibile allocare la memoria\n"); return(-1);}
}
i=i-1;
do{
printf("Vuoi inserire un altro voto? (si-no)\n");
scanf("%s",s);
if (strcmp(s,"no")!=0){
i++;
if ((voto=(int*)realloc(voto,(i+1)*sizeof(int)))==NULL){
printf("Impossibile allocare la memoria\n"); return(-1);}
if ((pes=(int*)realloc(pes,(i+1)*sizeof(int)))==NULL){
printf("Impossibile allocare la memoria\n"); return(-1);}
printf("Inserisci il voto\n");
scanf("%d",&voto[i]);
printf("Inserisci il suo peso\n");
scanf("%d",&pes[i]);
fprintf(ptrFile," %d %d",voto[i], pes[i]);
}
}while(strcmp(s,"si")==0);
mediap=MediaPesata(pes,voto,i+1);
printf("La media pesata e': %.2f\n",mediap);
system("pause");
free(voto);
free(pes);
return(0);
}
Al più presto disistallerò anche il dev c++ e metterò l'altro, ancora non ho avuto il tempo, grazie ancora per l'aiuto e per il tempo dedicato