c - ¿Cómo leer archivos de texto y copiarlos en una matriz de cadenas?

CorePress2024-01-25  16

Estoy intentando abrir un archivo llamado dictanary.txt y copiar su contenido en una matriz de cadenas. Pero olvidé cómo hacerlo.

Esto es lo que tengo hasta ahora:

int main(int argc, char** argv) 
{
    char dict[999][15];
    FILE *fp;
    fp = fopen("dictionary.txt", "r");
    while(feof (fp))
    {
            
    }
}

¿Alguien puede ayudarme con esto?

EDITAR: Hay 999 palabras en el archivo y todas tienen 15 caracteres o menos.

1

while (!feof(file)) siempre es incorrecto y while (feof(file)) no tiene sentido

- pmg

27/03/2021 a las 17:08

Dependerá de la estructura del archivo de entrada, pero fgets() y fscanf() o sscanf() serán útiles.

- MikeCAT

27/03/2021 a las 17:08

1

@pmg En realidad es while(feof (fp)) aquí. No ! y es peor.

- MikeCAT

27/03/2021 a las 17:08

1

¿Quieres hasta 999 palabras de menos de 15 caracteres cada una... o hasta 15 palabras de menos de 999 caracteres cada una (como sugiere tu código)?

- pmg

27/03/2021 a las 17:11

1

@Kazumi411 debería funcionar perfectamente, agregué un poco máse código para ayudarlo a identificar el problema. También agregué una muestra en vivo, compruébelo wandbox.org/permlink/TDDyZXswA07imf9a

-anastaciu

27/03/2021 a las 18:50



------------------------------------

Como se indica en los comentarios, while(!feof (fp)) no funcionará según lo previsto, también te falta el negativo, pero eso no viene al caso, una forma sencilla de hacerlo es usar fgets y aprovechar su retorno. valor para detectar el final del archivo, ya que devuelve NULL cuando no hay más líneas para leer:

#include <stdio.h>
#include <string.h>

int main()
{
    char dict[999][15];
    size_t ind; // store the index of last read line

    FILE *fp = fopen("dictionary.txt", "r");

    if (fp != NULL) // check if the file was succefully opened
    {
        // read each line until he end, or the array bound is reached
        for (ind = 0; fgets(dict[ind], sizeof dict[0], fp) && ind < sizeof dict / sizeof dict[0]; ind++)
        {
            dict[ind][strcspn(dict[ind], "\n")] = '
#include <stdio.h>

int main()
{
    char dict[999][15];
    FILE * fp;
    fp = fopen("dictionary.txt", "r");

    int i = 0;
    while (fscanf(fp, "%s", dict[i]) != EOF)
            i++;

    // i is your length of the list now so you can print all words with
    int j;
    for (j = 0; j < i; j++)
            printf("%s ", dict[j]);

    fclose(fp);
    return 0;
}
'; // remove newline from the buffer, optional } for (size_t i = 0; i < ind; i++) // test print { puts(dict[i]); } } else { perror("Error opening file"); } }

Tenga en cuenta que esto también leerá líneas vacías, es decir, líneas con solo \n u otros caracteres en blanco.

Muestra de prueba

4

También tenga cuidado: fgets() colocará el carácter de nueva línea leído en el búfer, por lo que es posible que desee eliminarlo antes de continuar con el procesamiento.

- MikeCAT

27/03/2021 a las 17:35

@MikeCAT agregó una opción para eliminarlo y también indicó que las líneas en blanco también se analizarán.

-anastaciu

27/03/2021 a las 17:40

Acabo de publicar una función para tener fgets sin la nueva línea si desea evitar analizar su cadena dos veces: codereview.stackexchange.com/questions/258772/… ¡Tus ideas son bienvenidas! @MikeCAT y anastaciu

-Antonin GAVREL

27/03/2021 a las 17:42

1

noe la edición en la pregunta que corrige el orden de las dimensiones de la matriz.

-Clifford

27/03/2021 a las 17:50



------------------------------------

fscanf(fp, "%s", dict[i]);

En lugar de != EOF, también puedes usar == 1 porque fscanf devuelve un valor de los elementos escaneados. Entonces, si lo haces:

1008611

Devolverá 1 si una palabra se escanea con éxito. Y no lo hará cuando llegue al final del archivo. Entonces tú también puedes hacerlo de esa manera.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare