Ti ringrazio del supporto, grazie davvero.
Ho deciso di guardare la soluzione, è da stamattina le 7 che sto su questi programmi e vorrei andare a letto...
Il seguente è la soluzione del professore. L'ho letta e l'ho capita. Unico problema è che non funziona xD
Se li chiedo di stamparmi a video il milionesimo numero, fa qualcos'altro, ed è lo stesso con altri numeri. Riesci ad individuare l'errore??
codice:
#include <stdio.h>

int prime(long long n) {   //Ritorna vero se e solo se n è un numero primo
    long long k = 2;
    while (k * k < n && (n % k) != 0) k++;
    return (k >= n || (n % k) != 0);
}

void writeprimetable(char *fname, int np) {
    FILE *f = fopen(fname, "wb");
    if (f == NULL) return;
    long n = 2, count = 0;
    while (count < np) {
        if (prime(n)) {
            fwrite(&n, sizeof(long), 1, f);
            count++;
        }
        n++;
    }
    fclose(f);
}

#define NUM_PRIMES     1000000L

int main(int argc, char *argv[]) {
    if (argc != 2) return 0;
    FILE *f = fopen(argv[1], "rb");   //Apre il file con la tabella
    if (f == NULL) {                  //Se il file non esiste lo crea
        printf("Elaborazione tabella...\n");
        writeprimetable(argv[1], NUM_PRIMES);
        printf("OK\n");
        f = fopen(argv[1], "rb");
    }
    if (f == NULL) return 0;
    while (1) {
        long k, p;
        printf("Numero d'ordine del numero primo (1 - %ld), 0 per terminare: ",
                NUM_PRIMES);
        scanf("%ld", &k);
        if (k < 1 || k > NUM_PRIMES) break;
        fseek(f, (k - 1)*sizeof(long), SEEK_SET);
        fread(&p, sizeof(long), 1, f);
        printf("Il %ld-esimo numero primo e' %ld\n", k, p);
    }
    return 0;
}