Il codice è giusto. è sbagliata la printf. I valori sono in percentuale.
prova questo..
	codice:
	#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include <iostream.h>
int main()
{
    long totale, i, temp;
    unsigned char c;
    float frequenze[256];
    FILE*fp1;
    
    
    
        fp1=fopen("capitolo1.txt", "r");
        if (fp1==NULL)
        {
         printf("Non ho trovato il file.\n");             
        }
        
        for (i=0; i<256; i++)
        {
        frequenze[i]=0;
        }
           totale =0;
        
        while(fscanf(fp1, "%c", &c)==1)
        {
                          if ((c < 0)||(c > 256))
                          {
                                             printf("il carattere %c non e' fra 0-255!\n", c);
                                             getchar();
                                             exit(-1);
                          }
                          temp=(int)c;
                          frequenze[temp]=frequenze[temp]+1;
                          totale =totale +1;
        }
        cout << "totale " << totale << endl;
        for (i=1; i<256; i++)
        {
            
            frequenze[i]=(frequenze[i]*100)/totale;
            //printf("n= ", i, " frequenza di " , char(i), " = ", frequenze[i], " %");
            cout << " n= " << i << " char = " << char(i) << " freq = " << frequenze[i] << endl;
        }
fflush(stdin);
getchar();
exit(0);
}