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.

Tengo un problema leyendo una matriz desde un archivo.

Creé dos hilos. El trabajo del primer hilo es sumar el arreglo y imprimirlo, y el trabajo del segundo hilo es encontrar el producto del arreglo y imprimirlo. Los dos hilos leen el arreglo desde un archivo de texto. Mi programa está codificado en duro, tengo un tamaño de arreglo de 40. El problema es que cada vez que ejecuto mi código obtengo la misma salida, incluso si cambio algunos números en mi arreglo. Debería darme un valor diferente dependiendo de cada vez que cambie algún número en el arreglo. Mi problema principal está en la parte que lee del archivo, mi programa funciona correctamente sin leer de un archivo.

#include <stdio.h>
#include <pthread.h>
int array[40];
int sum = 0;
long long int product = 1;

// función para leer el archivo
void read_ints(const char* file_name)
{
    FILE* file = fopen(file_name, "r");
    int i = 0;
    int j = 0;
    fscanf(file, "%d", &i);
    while (!feof(file)) {
        array[j] = i;
        j++;
        fscanf(file, "%d", &i);
        fscanf(file, "%d", &i);
    }
    array[j] = i;
    fclose(file);
}

void* sum_array(void* arg)
{
    for (int i = 0; i < 40; i++)
        sum += array[i];
}

void* product_array(void* arg)
{
    for (int i = 0; i < 40; i++)
        product *= array[i];
}

int main()
{
    read_ints("input.txt");
    pthread_t threads[2];
    pthread_create(&threads[0], NULL, sum_array, (void*)NULL);

    pthread_create(&threads[1], NULL, product_array, (void*)NULL);

    for (int i = 0; i < 2; i++)
        pthread_join(threads[i], NULL);

    printf("la suma es: %d \n", sum);
    printf("el producto es: %lli \n", product);

    return 0;
}

La siguiente es la compilación:

gcc yyy.c -o yyy -lpthread
./yyy input.txt

La salida que obtengo cada vez es:

la suma es: 1022
el producto es: -2987895910446399488
</pthread.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el arreglo no se está leyendo correctamente desde el archivo. La función de lectura de archivo (read_ints) no está manejando correctamente la entrada del archivo. Hay dos llamadas a fscanf en cada iteración del bucle while, lo que hace que el programa lea el mismo valor dos veces y salte cada otro valor. Es por eso que la salida es constante sin importar los valores en el archivo de entrada.

    Para solucionar el problema, solo debes llamar a fscanf una vez por iteración del bucle. La función corregida se vería así:

    void read_ints(const char* file_name)
    {
        FILE* file = fopen(file_name, "r");
        int i = 0;
        int j = 0;
        while (fscanf(file, "%d", &i) == 1 && j < 40) {
            array[j] = i;
            j++;
        }
        fclose(file);
    }
    

    Esta versión corregida lee un valor entero del archivo, verifica que se haya leído correctamente (fscanf devuelve el número de valores escaneados con éxito) y luego agrega el entero al arreglo. Esto soluciona el problema de la doble lectura de cada valor y asegura que el arreglo se llene correctamente con los valores del archivo de entrada.

Comments are closed.