Leer números de un archivo de texto en una matriz en C

4 minutos de lectura

avatar de usuario
Vonti

Soy un novato en programación, así que tengan paciencia conmigo.

Estoy tratando de leer números de un archivo de texto en una matriz. El archivo de texto, “somenumbers.txt” simplemente contiene 16 números como “5623125698541159”.

#include <stdio.h>
main()
{

    FILE *myFile;
    myFile = fopen("somenumbers.txt", "r");

    //read file into array
    int numberArray[16];
    int i;

    for (i = 0; i < 16; i++)
    {
        fscanf(myFile, "%d", &numberArray[i]);
    }

    for (i = 0; i < 16; i++)
    {
        printf("Number is: %d\n\n", numberArray[i]);
    }


}

El programa no funciona. Compila pero genera:

El número es: -104204697

El número es: 0

El número es: 4200704

El número es: 2686672

El número es: 2686728

El número es: 2686916

El número es: 2004716757

El número es: 1321049414

El número es: -2

El número es: 2004619618

El número es: 2004966340

El número es: 4200704

El número es: 2686868

El número es: 4200798

El número es: 4200704

El número es: 8727656

El proceso devolvió 20 (0x14) tiempo de ejecución: 0.118 s Presione cualquier tecla para continuar.

  • Has alcanzado… un stackoverflow. Historia verdadera.

    – Pierre Arlaud

    4 de diciembre de 2013 a las 14:51

cambiar a

fscanf(myFile, "%1d", &numberArray[i]);

  • @chux Es inútil si se adjunta el signo menos porque ha sido que es uno de los anchos de campo máximos para leer.

    – PIXY AZUL

    4 de diciembre de 2013 a las 15:29

  • Gracias, esto funciona, pero ¿podría explicar qué está pasando exactamente con el 1 en el %1d. Por ejemplo, %2d no funciona Además, tengo otro archivo que tiene 16 números pero cada número está separado por una coma. pensé que fscanf(myFile, "%d,", &numberArray[i]); funcionaría pero no funciona. ¿Puede usted ayudar?

    – Vonti

    4 de diciembre de 2013 a las 15:54


  • @Vonti "%1d" 1:leer el tamaño máximo de fileld. creo que puede ser un "%d," si está separado por una coma.

    – PIXY AZUL

    4 de diciembre de 2013 a las 16:02


  • Esto es lo que tengo pero no funciona. Abriré la publicación de otra pregunta con mi código. No hay tanto espacio aquí.

    – Vonti

    4 de diciembre de 2013 a las 16:13

avatar de usuario
trucos

5623125698541159 se trata como un solo número (fuera del rango de int en la mayoría de la arquitectura). Necesitas escribir números en tu archivo como

5 6 2 3 1 2 5  6 9 8 5 4 1 1 5 9  

para 16 números.

Si su archivo tiene entrada

5,6,2,3,1,2,5,6,9,8,5,4,1,1,5,9 

entonces cambia %d especificador en su fscanf para %d,.

  fscanf(myFile, "%d,", &numberArray[i] );  

Aquí está su código completo después de algunas modificaciones:

#include <stdio.h>
#include <stdlib.h>

int main(){

    FILE *myFile;
    myFile = fopen("somenumbers.txt", "r");

    //read file into array
    int numberArray[16];
    int i;

    if (myFile == NULL){
        printf("Error Reading File\n");
        exit (0);
    }

    for (i = 0; i < 16; i++){
        fscanf(myFile, "%d,", &numberArray[i] );
    }

    for (i = 0; i < 16; i++){
        printf("Number is: %d\n\n", numberArray[i]);
    }

    fclose(myFile);

    return 0;
}

  • Mi otro archivo tiene el formato 1,2,3,4, etc. pero sin espacios. Sin embargo, agregar la coma al %d todavía no funciona.fscanf(myFile, "%d,", &numberArray[i]);

    – Vonti

    4 de diciembre de 2013 a las 16:31


  • @Vonti, estoy publicando su código completo después de algunas modificaciones. Ver la edición.

    – trucos

    4 de diciembre de 2013 a las 16:37


  • Gracias esto funciona muy bien. Tengo problemas para cerrar el archivo con fclose después de la primera parte de mi programa. Corro fclose(myFile); luego en la siguiente linea if (myFile == NULL) { printf("Error Reading File\n\n"); exit (0); } else { printf("file still ok\n\n"); } pero dice else o “file still ok”, lo cual es realmente extraño, pero logré cerrar (ocultarme) las 2 mitades del programa con { } para que funcione.

    – Vonti

    4 de diciembre de 2013 a las 20:01


  • Si. Debería ser. La próxima vez que el archivo se abra de nuevo por fopen.

    – trucos

    4 de diciembre de 2013 a las 23:05

  • Esta pregunta no estaba relacionada con cuál es mi problema real, pero su respuesta respondió directamente con qué estaba teniendo un problema… sin mencionar que realmente explica por qué el error esta ocurriendo Gracias. +1.

    – rayryeng

    26 de septiembre de 2017 a las 14:39


for (i = 0; i < 16; i++)
{
    fscanf(myFile, "%d", &numberArray[i]);
}

Esto está intentando leer toda la cadena, "5623125698541159" dentro &numArray[0]. Necesita espacios entre los números:

5 6 2 3 ...

Bucle con %c para leer el flujo carácter por carácter en lugar de %d.

Hay dos problemas en su código:

  • el valor de retorno de scanf deber ser revisado
  • los %d conversión no tiene en cuenta los desbordamientos (aplicando ciegamente *10 + newdigit para cada carácter numérico consecutivo)

El primer valor que obtuviste (-104204697) es igual a 5623125698541159 módulo 2^32; es pues el resultado de un desbordamiento (si int donde 64 bits de ancho, no ocurriría desbordamiento). Los siguientes valores no están inicializados (basura de la pila) y, por lo tanto, son impredecibles.

El código que necesita podría ser (similar a la respuesta de BLUEPIXY anterior, con la ilustración de cómo verificar el valor de retorno de scanfel número de elementos que coincidieron correctamente):

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i, j;
    short unsigned digitArray[16];
    i = 0;
    while (
        i != sizeof(digitArray) / sizeof(digitArray[0])
     && 1 == scanf("%1hu", digitArray + i)
    ) {
        i++;
    }
    for (j = 0; j != i; j++) {
        printf("%hu\n", digitArray[j]);
    }
    return 0;
}

avatar de usuario
ROCOSO 007

ingrese la entrada de su archivo como esta, por ejemplo: 12 13 22 45 (después de que cada número presione enter) luego ejecute su programa, se ejecutará correctamente

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad