txt - leer un archivo en c
Leyendo nĂºmeros de un archivo de texto en una matriz en C (5)
Soy un noob de programación, así que por favor tengan paciencia conmigo.
Estoy tratando de leer los números de un archivo de texto en una matriz. El archivo de texto "somenumbers.txt" simplemente contiene 16 números, por lo que "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 produce:
El número es: -104204697
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
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.
Haga un bucle con% c para leer la secuencia de caracteres por carácter en lugar de% d.
Hay dos problemas en su código:
- el valor de retorno de
scanf
debe ser verificado - La conversión
%d
no tiene en cuenta los desbordamientos (aplicando a ciegas*10 + newdigit
para cada carácter numérico consecutivo)
El primer valor que tienes ( -104204697
) es igual a 5623125698541159
módulo 2^32
; por lo tanto, es el resultado de un desbordamiento (si int
tuviera 64 bits de ancho, no se produciría ningún desbordamiento). Los siguientes valores están sin inicializar (basura de la pila) y, por lo tanto, 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
, el número de elementos coincidentes exitosamente):
#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;
}
cambiar a
fscanf(myFile, "%1d", &numberArray[i]);
5623125698541159
se trata como un número único (fuera del rango de int
en la mayoría de las arquitecturas). 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 numeros
Si su archivo tiene entrada
5,6,2,3,1,2,5,6,9,8,5,4,1,1,5,9
luego cambie el especificador %d
en su fscanf
a %d,
fscanf
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;
}
for (i = 0; i < 16; i++)
{
fscanf(myFile, "%d", &numberArray[i]);
}
Esto está intentando leer la cadena completa, "5623125698541159"
en &numArray[0]
. Necesitas espacios entre los números:
5 6 2 3 ...