1

esta es mi siguiente piedra en el camino:

Estoy intentando guardar las palabras que me aparecen en un archivo en un array para luego poder utilizarlas.

Nombre archivo: nombreFichero
Contiene: Esto
          es
          Una
          prueba

El código sobre el que trabajo es el siguiente:

 int main() {
     char mat[4][10];
     FILE *fichero;
     int c, i=0, j=0;
 
     fichero= fopen("nombreFichero.txt", "r");
 
     do{
         c = fscanf(fichero, "%s", mat);
         if (c != EOF)
             scanf("%s", mat[i][j]);
     }
     while (c != EOF);
     fclose(fichero);
     return 0;  
}

El problema es que no me guarda nada

Mary
  • 11
  • 2
  • Que es lo que hace esta linea? `scanf("%s", mat[i][j]);`. Y `fscanf` espera un `char*` no un `char**` *(`c = fscanf(fichero, "%s", mat);`)*. – Pablochaches Mar 20 '21 at 00:41

2 Answers2

2

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;  
}
MrDave1999
  • 7,491
  • 1
  • 7
  • 22
1

El problema es que la función fscanf(fichero, "%s", mat); espera un array en su tercer argumento, no la matriz como tu intentas pasarle, para que esto funcione tienes que pasarle los array así fscanf(fichero, "%s", &mat[i]); y luego se debe incrementar en una unidad el indice para pasar al siguiente array y así se van guardando los strings del archivo en la matriz mat[4][10] tal como se muestra en el código ya arreglado

#include <stdio.h>
 
int main(){
    char mat[4][10];
    FILE *fichero;
    int c, i = 0;
    
    fichero = fopen("nombreFichero.txt","r");
    
    do{
        c = fscanf(fichero,"%s",&mat[i]);
        i = i+1;
    }while(c != EOF);
    
    for(i = 0; i < 4; i++){
        printf("%s\n",mat[i]);
    }
    
    fclose(fichero);
    
    return 0;  
}

ademas de solucionar ese error, en el ciclo for que viene justo a continuación del ciclo do-while se muestran las palabras guardadas en la matriz

Accimus
  • 155
  • 5