es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna forma de asignar elementos de un array a valores de una estructura?

Entonces lo que tengo es el siguiente array:

10
1 250 350 50
2 525 200 80
3 425 700 60
4 675 475 65
5 850 850 40
6 925 200 90
7 1050 575 80
8 1250 800 70
9 1375 400 60
10 1500 650 40

Cada valor de cada línea significa algo diferente, por ejemplo:

1   250  350    50
id  lat  long  value

Quiero asignar cada uno de esos valores de línea a una estructura para poder jugar con ellos, pero después de buscar en Google y encontrarme con la teoría de grafos (que es más o menos similar a lo que estoy tratando de hacer), nada funcionó… Debo decir que este array se extrae de un archivo de texto, ya sea que eso sea o no relevante.

struct poblacion {
    int id;
    int latitud;
    int longitud;
    int valor;
};

No puedo encontrar ninguna solución, ¿alguien puede ayudarme o al menos proporcionarme algunos tutoriales o artículos para ayudarme a aclarar mi mente?

Aquí está mi código:

“`cpp
#include <stdio.h>
#include <math.h>
#include <string.h>

#define RSIZE 20
#define CSIZE 11

struct poblacion {
int id;
int latitud;
int longitud;
int valor;
};

int main(void) {
char line[CSIZE][RSIZE];
char fname[20];
FILE *fptr = NULL;
int i = 0;
int tot = 0;
printf("\n\n Leer el archivo y almacenar las líneas en un array:\n");
printf("————————————————————\n");
printf(" Introduzca el nombre del archivo a abrir: ");
scanf("%s", fname);

<pre><code>fptr = fopen("cord.txt", "r");
while (fgets(line[i], RSIZE, fptr)) {
line[i][strlen(line[i]) – 1] = '\0';
i++;
}
tot = i;
printf("\n El contenido del archivo %s es: \n", fname);
for (i = 0; i < tot; ++i) {
printf(" %s\n", line[i]);
}
printf("\n");
return 0;
</code></pre>

}
“`</string.h></math.h></stdio.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para asignar los valores del array a la estructura, puedes modificar tu código de la siguiente manera:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define RSIZE 20
    #define CSIZE 11
    
    struct poblacion{
        int id;
        int latitud;
        int longitud;
        int valor;
    };
    
    int main(void) 
    {
        char linea[CSIZE][RSIZE];
        char nombre_archivo[20];
        FILE *archivo = NULL;
        int i, tot = 0;
    
        printf("\n\nLee el archivo y almacena las líneas en un array:\n");
        printf("------------------------------------------------\n");
        printf("Ingresa el nombre del archivo a abrir: ");
        scanf("%s", nombre_archivo);
    
        archivo = fopen(nombre_archivo, "r");
        if(archivo == NULL) {
            printf("Error al abrir el archivo %s\n", nombre_archivo);
            exit(EXIT_FAILURE);
        }
    
        // Contar el número de líneas en el archivo
        while (fgets(linea[i], RSIZE, archivo)) {
            i++;
        }
        tot = i;
    
        // Asignar memoria para el array de struct poblacion
        struct poblacion *pob = malloc(tot * sizeof(struct poblacion));
    
        // Analizar cada línea y asignar valores a la estructura
        for (i = 0; i < tot; ++i) {
            sscanf(linea[i], "%d %d %d %d", &pob[i].id, &pob[i].latitud, &pob[i].longitud, &pob[i].valor);
        }
    
        // Imprimir los valores de la estructura para verificar la asignación
        for (i = 0; i < tot; ++i) {
            printf("id: %d, latitud: %d, longitud: %d, valor: %d\n", pob[i].id, pob[i].latitud, pob[i].longitud, pob[i].valor);
        }
    
        // Liberar memoria asignada
        free(pob);
    
        return 0;
    }
    

    Explicación:

    • Después de abrir el archivo y contar el número de líneas, asignamos memoria para el array de struct poblacion utilizando malloc() (recuerda incluir stdlib.h).
    • En el bucle for, se utiliza sscanf() para analizar cada línea y asignar sus valores a los campos correspondientes de la estructura.
    • Por último, imprimimos los valores de la estructura para verificar que se asignaron correctamente y liberamos la memoria asignada utilizando free().
    • Ten en cuenta que el nombre del archivo ingresado por el usuario ahora se utiliza como argumento para fopen(), en lugar de una cadena codificada.

    ¡Espero que esto te ayude! Déjame saber si tienes alguna pregunta o inquietud adicional.</string.h></stdlib.h></stdio.h>

Comments are closed.