El código esta mal por varias razones:
1. Siempre guardas la misma cadena en la posición mat[0][0]
. Acuérdate que esta sentencia:
c = fscanf(fichero, "%s", mat);
Es lo mismo que escribir:
c = fscanf(fichero, "%s", &mat[0][0]);
Por lo que es lógico que nunca puedas acceder a las palabras.
2. No tiene sentido usar la función scanf
. Esta rutina detiene el programa para que el usuario pueda introducir algún dato y esto no es lo que tu quieres hacer.
Tal vez querías hacer algo como esto:
int main()
{
char mat[4][10];
FILE *fichero;
int i=0;
fichero= fopen("nombreFichero.txt", "r");
do
{
c = fscanf(fichero, "%s", mat[i++]);
}while (c != EOF);
fclose(fichero);
return 0;
}
Un arreglo bidimensional en realidad es un conjunto de arreglos unidimensional. Por lo que tendrías guardado en mat
lo siguiente:
mat[0] --> Esto
mat[1] --> es
mat[2] --> Una
mat[3] --> prueba
Esta es la razón del porque se debe incrementar i
, ya que le debes pasar a fscanf
la dirección base del arreglo donde se va a guardar la línea leída.
El problema del código anterior, es que ocurrirá un desbordamiento de búfer, ya que el do-while
genera en este caso 5
iteraciones, por lo que desbordas el array mat
.
Una manera de solucionar este error es usando un while
(combinado con feof) y leer el fichero hasta encontrar el final del archivo (es decir, el EOF
):
int main()
{
char mat[4][10];
FILE *fichero;
int i=0;
fichero= fopen("nombreFichero.txt", "r");
while(!feof(fichero))
fscanf(fichero, "%s", mat[i++]);
fclose(fichero);
return 0;
}