web-dev-qa-db-fra.com

Lecture des nombres d'un fichier texte dans un tableau en C

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.

26
Vonti

changer à

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

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;
}
12
haccks
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 ...
3
Fiddling Bits

Boucle avec% c pour lire le flux caractère par caractère au lieu de% d.

2
Pierre Arlaud

Il y a deux problèmes dans votre code:

  • la valeur de retour de scanfdoit être vérifiée
  • le %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;
}
2
Loic