IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Saisie de nombres dans un tableau de char


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 192
    Points : 678
    Points
    678
    Par défaut Saisie de nombres dans un tableau de char
    Salut à tous,

    Je vais essayer d'exposer mon problème le plus clairement possible:
    J'ai un fichier qui contient des nombres dont la structure est:
    1 0 2 34 1 21
    3 12 7 6 13 0
    A noter que j'ai choisi ces nombres arbritrairement, pour bien que vous voyiez que chaque nombre est composé de 1 ou 2 chiffres (jamais plus) et est séparé par un espace du nombre voisin.
    J'aimerais récupérer ces nombres dans un tableau de char à 2 dimensions.
    Voici le code que j'ai d'abbord pensé faire:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int i, j;
        char table[5][5];
        FILE *fichier;
        fichier=fopen("texte.txt", "r");
     
        for(i=0;i<=4;i++){
            for(j=0;j<=4;j++){
                fscanf(fichier, "%c", &table[i][j]);
                printf("table de i: %d et j: %d = %d\n", i, j, (table[i][j]-'0'));
            }
        }
        fclose(fichier);

    Mais je me suis vite rendu compte de deux problèmes:
    Les espaces et les retours à la ligne étant des char, ils se mettent dans les cases de mon tableau à la place des nombres. Ce problème peut être contourné assez facilement en ignorant le caractère s'ils s'agit d'un espace ou d'un retour à la ligne.

    En revanche le deuxième problème qui s'est posé et pour lequel je me tourne vers vous (qui était largement prévisible d'ailleurs) est que comme 31 (par exemple) est composé de 2 caractères, chacun s'enregistre dans une case différente de mon tableau.

    Je pense donc qu'il faudrait rajouter une dimension [k] au tableau pour pouvoir enregistrer chaque nombre comme une chaine mais je ne sais pas comment implémenter cette dimension (si c'est la bonne solution).

    En esperant que quelqu'un pourra apporter quelques éléments de réponse à mon problème.

    Cordialement,

    Lyons

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu souhaites récupérer des nombres et pourtant tu lis des caractères : lis des nombres !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    static const int lines = 5, colums = 5;
    // A ajuster a la taille du fichier si elle est connue
    // Sinon, il faut la determiner
     
    int main(void)
    {
        int table[lines][colums];
     
        FILE *fichier;
        fichier=fopen("texte.txt", "r");
     
        for(int i=0;i<lines;i++){
            for(int j=0;j<colums;j++){
                fscanf(fichier, "%d", &table[i][j]); // changement du format !
                printf("table[%d][%d] = %d\n", i, j, table[i][j]);
            }
        }
     
        fclose(fichier);
        return 0;
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 192
    Points : 678
    Points
    678
    Par défaut
    avec ton code ça plante pas y'a pas de différence fondamentale avec le mien pourtant (t'avais fait un tableau de int alors que je voulais un tableau de char mais même après modification ça marche)

    Merci beaucoup

    Lyons

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    De rien

    En fait, il y a une différence fondamentale : l'interprétation faite par fscanf() du flux de données. Dans ton cas, il lit simplement 8 octets et te donne donc un char. Dans mon cas, il cherche dans ce flux à extraire des nombres, souvent en analysant plusieurs caractères.

    Si tu donc à table un type char[][], je ne suis pas certain que le résultat soit garantit. Il y a en effet un warning du compilateur à l'utilisation de fscanf() et je ne serai pas étonné qu'écrire un entier écrive en fait l'équivalent de 4 caractères (sur un système 32 bits classique). Teste quand même bien le comportement.

    Bonne soirée.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 192
    Points : 678
    Points
    678
    Par défaut
    Ouais je ne manquerai pas de tester ça car sur mon code avec un %d à la place du %c ça plante aussi =s

    Bon en tous cas maintenant ça marche je suis crevé je ferai des tests demain pour voir la différence entre les différentes synthaxes de manière un peu plus précise.

    Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Charger et générer des nombres dans un tableau
    Par virtuadrack dans le forum C
    Réponses: 7
    Dernier message: 30/03/2007, 16h35
  2. Copier un long dans un tableau de char?
    Par the_ionic dans le forum C
    Réponses: 15
    Dernier message: 29/06/2006, 09h31
  3. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  4. Comparaison de nombre dans un tableau.
    Par slackjayo dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 29/04/2005, 17h21
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo