Ho un file contenente una matrice di caratteri. Devo semplicemente inserirla all'interno di una matrice allocata dinamicamente.
La matrice nel file è questa:
a b b d h f
g h i j k k
b d d h j l
main.c
int main(int argc, char** argv){
char* nomefile = "file1.txt";
int n_righe = 0, n_colonne = 0;
char** mat = leggi_matrice(nomefile, &n_righe, &n_colonne);
}
funzione.c
char** leggi_matrice(const char* nomefile, int *r, int *c)
{
char buffer[200], *res, **mat, temp;
int i = 0, j = 0;
FILE *f = fopen(nomefile, "r");
if(nomefile == NULL)
printf("Errore apertura file. \n");
else
{
//Acquisizione numero di colonne
res = fgets(buffer, 200, f);
while(res[i] != '\0')
{
if(res[i] == ' ')
*c = *c +1;
i++;
}
*c = *c +1; //In una stringa di caratteri, separati ognuno
//da uno spazio, gli elementi della stringa sono
//*c spazi +1
printf("\nNumero colonne: %d\n", *c);
//Riposiziono il cursore all'inizio del file
fseek(f, 0, 0);
//Conto il numero della righe
while(1)
{
res = fgets(buffer, 200, f);
if(res == NULL)
break;
*r = *r + 1;
}
printf("\nNumero righe: %d\n", *r);
//Allocazione dinamica della memoria
mat = (char**) malloc (*c * sizeof(char*));
for(i = 0; i < *c; i++)
mat[i] = (char*) malloc (*r * sizeof(char));
fseek(f, 0, 0);
//Caricamento della matrice da file
while(!feof(f))
{
for(i = 0; i < *r; i++)
for(j = 0; j < *c; j++)
{
fscanf(f, "%c", &temp);
if((temp != ' ')&&(temp != '\0'))
mat[i][j] = temp;
}
}
fclose(f);
//Stampa della matrice
for(i = 0; i < *r; i++)
{
for(j = 0; j < *c; j++)
printf("%c", mat[i][j]);
//printf("\n");
}
}
}
Il compilatore non da errori, e mi stampa:
Numero colonne: 6
Numero righe: 3
Il che è giusto, quindi il file lo legge.
Mi sono accorto però che:
while(!feof(f))
{
for(i = 0; i < *r; i++)
for(j = 0; j < *c; j++)
{
fscanf(f, "%c", &temp);
if((temp != ' ')&&(temp != '\0'))
mat[j] = temp;
}
}
Non lo legge! Infatti, mettendo dei printf prima e dopo il ciclo questi me li stampa, mentre nel ciclo non ci entra proprio. Ho uno stesso algoritmo identitco, solo che la matrice è di int e funziona. Perché questo no? Grazie