Ho un problema strano, non riesco a far leggere una matrice quadrata da file ememorizzarla in un array bidimensionale allocato dinamicamente.

La matrice è memorizzata nel file in questo modo:

4
0 1 1 0
1 0 1 1
0 0 0 1
1 1 0 0

dove nella prima riga ho la dimensione e poi dalla seconda riga in poi ho la matrice. Il codice che uso per fare tuuto il lavoro è questo:
codice:
 
int** mappa;
int dim,i,j;
char* filemap;
FILE * sorgente;
   
dim=0;
    
printf("Digita il nome del file dove risiede la mappa da analizzare: ");
scanf("%s",filemap);

sorgente=fopen(filemap,"r"); /* apre il file sorgente */
if( sorgente==NULL ){
        printf("Errore in apertura del file");
        return 0;
}
rewind(sorgente); /* resetta l'offset del file */
fscanf(sorgente,"%d\n",&dim); /* legge la dimensione dalla prima riga del file */
    
if (dim==0){
    printf("errore");
    return 0;
}

/* Allocazione strutture dati */

mappa=(int**)calloc(dim,sizeof(int*)); /* alloca puntatori alle righe */
if (mappa==NULL){
    printf("errore di allocazione");
    return 0;
}
for(i=0;i<dim;i++) /* ciclo di allocazione */
{                    
mappa[i]=(int*)calloc(dim,sizeof(int));
if (mappa[i]==NULL){
   printf("errore di allocazione");
   return 0;
}
}

/* inizializzazione matrice di adiacenza */
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
	fscanf(sorgente,"%d",&tmp);
        mappa[i][j]=tmp;
}
}
Cosa c'è di sbagliato???