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

Soy un novato en progtwigción así que por favor tengan paciencia conmigo.

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

#include  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 progtwig no funciona. Comstack pero produce:

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

Proceso devuelto 20 (0x14) tiempo de ejecución: 0.118 s Presione cualquier tecla para continuar.

cambiar a

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

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

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

por 16 números.

Si tu archivo tiene entrada

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

luego cambie %d especificador en su fscanf a %d, fscanf

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

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

 #include  #include  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; } 
 for (i = 0; i < 16; i++) { fscanf(myFile, "%d", &numberArray[i]); } 

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

 5 6 2 3 ... 

Bucle con% c para leer la secuencia carácter por carácter en lugar de% d.

Hay dos problemas en tu código:

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

El primer valor que obtuvo ( -104204697 ) es igual a 5623125698541159 módulo 2^32 ; es, por lo tanto, el resultado de un desbordamiento (si int 64 bits de ancho, no se produciría desbordamiento). Los siguientes valores no están inicializados (basura de la stack) 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 scanf , la cantidad de elementos que coinciden con éxito):

 #include  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; }