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
</pthread.h></stdio.h>
el producto es: -2987895910446399488
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 afscanf
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í: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.