Je suis un programmeur, alors je vous en prie, supportez-moi.
J'essaie de lire les nombres d'un fichier texte dans un tableau. Le fichier texte "somenumbers.txt" contient simplement 16 chiffres, ainsi "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]);
}
}
Le programme ne fonctionne pas. Il compile mais produit:
Nombre est: -104204697
Le nombre est: 0
Nombre est: 4200704
Nombre est: 2686672
Nombre est: 2686728
Nombre est: 2686916
Le nombre est: 2004716757
Nombre est: 1321049414
Le nombre est: -2
Le nombre est: 2004619618
Le nombre est: 2004966340
Nombre est: 4200704
Nombre est: 2686868
Nombre est: 4200798
Nombre est: 4200704
Nombre est: 8727656
Le processus a renvoyé 20 (0x14) temps d’exécution: 0,118 s Appuyez sur n’importe quelle touche pour continuer.
changer à
fscanf(myFile, "%1d", &numberArray[i]);
5623125698541159
est traité comme un nombre unique (hors de la plage de int
sur la plupart des architectures). Vous devez écrire les nombres dans votre dossier en tant que
5 6 2 3 1 2 5 6 9 8 5 4 1 1 5 9
pour 16 numéros.
Si votre fichier a une entrée
5,6,2,3,1,2,5,6,9,8,5,4,1,1,5,9
puis changez %d
spécificateur dans votre fscanf
à %d,
.
fscanf(myFile, "%d,", &numberArray[i] );
Voici votre code complet après quelques modifications:
#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]);
}
Ceci tente de lire la chaîne entière, "5623125698541159"
en &numArray[0]
. Vous avez besoin d'espaces entre les nombres:
5 6 2 3 ...
Boucle avec% c pour lire le flux caractère par caractère au lieu de% d.
Il y a deux problèmes dans votre code:
scanf
doit être vérifiée%d
_ la conversion ne prend pas en compte les débordements (application aveugle de *10 + newdigit
pour chaque caractère numérique consécutif)La première valeur que vous avez obtenue (-104204697
) est égal à 5623125698541159
modulo 2^32
; c'est donc le résultat d'un débordement (si int
où 64 bits de large, aucun débordement ne se produirait). Les valeurs suivantes sont non initialisées (déchets de la pile) et donc imprévisibles.
Le code dont vous avez besoin pourrait être (similaire à la réponse de BLUEPIXY ci-dessus, avec l'illustration permettant de vérifier la valeur de retour de scanf
, le nombre d'éléments correspondants):
#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;
}