Prova a stampare il valore di errno (includendo errno.h) laddove hai problemi con l'istruzione perror(NULL) o fprintf(stderr, "%s", strerror(errno));

Comunque così a occhio...

codice:
    if(canopen(file2, "rb")) {
        remove(file2);
    }
    
    f1 = fopen(filename, "rb");
    f2 = fopen(file2, "rb");
    
    if (f1==NULL || f2==NULL) {
        fprintf(stderr, "Error opening files.\n");
        fclose(f1);
        fclose(f2);
        return false;
    }
non ne comprendo il senso... verifichi se file2 può essere aperto in lettura binaria; se è possibile, lo elimini (?) dopodiché riapri entrambi i file in lettura... a parte che file2 credo debba essere aperto in modalità wb visto che vuoi scriverci (ma hai scritto rb), è ovvio che se elimini dal FS file2 e poi provi ad aprirlo in lettura avrai un errore, non puoi leggere da un file che non esiste.