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 :

fgetc dans une variable buffer


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Par défaut fgetc dans une variable buffer
    Bonjour, je cherche à créer une nouvelle chaîne de caractère à partir de fgetc ... Je ne veux pas lire la ligne entière, juste couvrir des nom de player et des scores séparé par des virgules.
    Merci de votre attention.

    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
    void test(char* filename){
        FILE *fic = fopen(filename, "r");
        int i = 0;
        int lettre = 0;
        //char str[50] = {0};
        int str[50] = {0}; /* stocker dans des variables. */
        if(fic==NULL){exit(1);}
        /* fgetc : fonction qui retourne un entier et non un char. */
        while((lettre = fgetc(fic)) != EOF) /* tester la fin d'un fichier. */
        {
            //printf("%c", lettre);
            if(lettre != ';'){
                str[i] = lettre;
                i += 1;
            }
            if(lettre = ';'){
                printf("%ls", str);
                i = 0;
                for(int j = 0; j<=50; j++)
                    str[j] = 0;
            }
        }
        fclose(fic);
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Par défaut
    Je vais déjà m'autoflageler mais ceci lettre = ';' doit être lettre == ';' (je ne comprend pas pourquoi ceci lettre = ';' fonctionne et pas l'égalité (ce qui est souhaité) lettre == ';')

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    A = b; assigne B à A et retourne A. C'est pour ça que c'est une syntaxe acceptée dans le cas d'un if.
    pas l'égalité (ce qui est souhaité) lettre == ';')
    Cette syntaxe est tout à fait correcte, pourquoi dis-tu qu'elle ne fonctionne pas ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Magnum8760 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            int str[50] = {0}; /* stocker dans des variables. */
            if(lettre != ';'){
                str[i] = lettre;
                i += 1;
            }
            if(lettre == ';'){
                printf("%ls", str);
                i = 0;
                for(int j = 0; j<=50; j++)
                    str[j] = 0;
            }
        }
    }
    Je vais déjà m'autoflageler mais ceci lettre = ';' doit être lettre == ';' (je ne comprend pas pourquoi ceci lettre = ';' fonctionne et pas l'égalité (ce qui est souhaité) lettre == ';')
    Mouais. Tu peux t'autoflageller. Déjà écrire if (truc) puis juste en dessous if (not truc) ça me laisse un peu perplexe. Mais surtout as-tu réfléchi à la taille de "str" et le nombre de cases remplies si tu boucles de 0 inclus à 50 inclus ???

    Accessoirement tu as memset() qui fait le même travail à ta place...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Agronome
    Inscrit en
    Septembre 2018
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Agronome
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2018
    Messages : 97
    Par défaut
    Bonjour

    Je suis revenu noté le problème comme résolu (je n'ai pas reçu de notification mail pour le dernier message).

    Au passage, j'ai prit connaissance de ceci pour lire un string, avec espace, avec sscanf : %[^\n] (ça vaut ce que ça vaut).

    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
    void readData2(char *filename){
        FILE *fic = NULL;
        fic = fopen(filename, "r");
        char nom[40];
        int score = 0;
        char tab[40];
        if(fic == NULL)
            exit(1);
        do {
            /* lire ligne par ligne */
            fgets(tab, sizeof(tab),fic);
            /* récupérer les valeurs du tableau et les séparer dans les 2 variables. */
            sscanf(tab,"%d;%[^\n]\n",&score, nom);
            printf("Nom : %s\n", nom);
            printf("Val : %d\n", score);
        } while(!feof(fic)); /* tester la fin d'un fichier. */
        fclose(fic);
    }
    Mais surtout as-tu réfléchi à la taille de "str" et le nombre de cases remplies si tu boucles de 0 inclus à 50 inclus ???
    Aie oui, 50 et une de trop.

    Mouais. Tu peux t'autoflageller. Déjà écrire if (truc) puis juste en dessous if (not truc) ça me laisse un peu perplexe.
    La est tout le problème, if else ne pouvais pas fonctionner car if( test une égalité avec "==") et l'autre if("=" est une attribution à une valeur).

    En fait ce gros bullshit de code est due au fait que je n'ai pas bien compris la définition de fgetc, je savais plus si je devais stocker mes caractères dans une chaine et ajouter un anti-slash zéro ou bien stocker mes caractères (cast to an int) dans un tableau d'entiers ???
    fgetc : This function returns the character read as an unsigned char cast to an int or EOF on end of file or error.
    https://www.tutorialspoint.com/c_sta...tion_fgetc.htm
    Je pense être dans le bon en disant qu'il faut déclarer un tableau d'entiers, ensuite tester si ma valeur == valeur ascii de Point-Virgule et enfin caster mes valeurs entières de mon tableau avec unsigned char (pour correspondre à la définition de fgetc).


    Merci,

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Magnum8760 Voir le message
    La est tout le problème, if else ne pouvais pas fonctionner car if( test une égalité avec "==") et l'autre if("=" est une attribution à une valeur).
    Tu veux dire que tu as vraiment voulu écrire if(lettre = ';') sous-entendant que tu testais une affectation ????

    Citation Envoyé par Magnum8760 Voir le message
    En fait ce gros bullshit de code est due au fait que je n'ai pas bien compris la définition de fgetc, je savais plus si je devais stocker mes caractères dans une chaine et ajouter un anti-slash zéro ou bien stocker mes caractères (cast to an int) dans un tableau d'entiers ???
    Ok. fgetc() récupère un caractère du flux demandé. "caractère" à prendre au sens large c'est à dire un octet (donc pas forcément un caractère "printable").

    Ensuite un octet a une valeur comprise entre 0 et 255 s'il est non signé, ou bien entre -128 et 127 s'il est signé. Mais ces valeurs en signé ou en non signé ne sont qu'une représentation selon différentes convention d'une même valeur binaire. Ainsi par exemple l'octet 11111111 sera vu comme 255 en non signé et -1 en signé. Ca veut dire qu'on peut très bien avoir l'impression que fgetc() a renvoyé renvoyer l'octet "-1" si c'est la valeur 11111111 qui est stockée dans le flux et si on l'affiche mal.
    Mais fgetc() doit aussi renvoyer une valeur spéciale (valeur qui n'est donc pas issue du flux) indiquant "il n'y a plus rien à lire". Comment coder cette valeur si toutes les valeurs possibles d'un char sont susceptibles de représenter un char réellement lu ?
    La solution a été que fgetc() renvoie non pas un char (un octet) mais un int (2 octets). Et si c'est du caractère lu, alors le second octet vaut 0. Mais si c'est la valeur spéciale, alors le retour sera "-1" mais "-1" int et non "-1" char. Et là on peut alors différencier la valeur "00000000 11111111" qui vaut 255 (car le bit de signe est à 0) et la valeur "11111111 11111111" qui vaut, là, -1 (ou 65535 en non signé).

    Donc j'ai pas trop suivi ce que tu cherches à faire mais la solution "tableau d'int" n'est pas à retenir. Tu veux stocker des char, c'est un tableau de char qu'il te faut. Mais tu dois toi récupérer la valeur de fgetc() dans un int pour que toi tu puisses faire la différence entre "-1" int et "-1" char. Ensuite, copier cet int dans un char ne pose aucun souci (l'octet de trop est alors purement coupé lors de la copie).

    Quant au '\0' que tu veux stocker c'est toi qui voit. Si tu garantis à l'utilisateur une string au sens "C" tu dois le mettre et sinon, non.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Stocker un noeud dans une variable
    Par Devotion dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 23/09/2004, 17h02
  2. [Sybase] résultat d'un select dans une variable
    Par stoz dans le forum Sybase
    Réponses: 2
    Dernier message: 14/09/2004, 14h28
  3. Résultat d'une requête dans une variable...
    Par Hoegaarden dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/04/2004, 13h51
  4. Réponses: 6
    Dernier message: 24/07/2003, 12h39
  5. [langage] Extraire un block dans une variable multiligne
    Par |DUCATI| DesMo dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2003, 14h56

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