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

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : janvier 2019
    Messages : 6
    Points : 2
    Points
    2

    Par défaut Recupération des données

    Bonjour ,
    Supposons qu'on a un fichier texte : lexique.txt qui contient des données sous la forme :
    1 !

    2 ?

    3 ...

    4 julien

    5 julo

    6 juleno


    ... etc (c'est a dire sous la forme : code_mot suivi d'un espace suivi du mot.
    On veut créer un programme en C qui parcours tt les lignes du fichier lexique.txt et recupere le code_mot et il recupere aussi "calu" = le mot mais en affichant les caracteres du mot (en prenant en compte le codage et le nombre d'octet pour les caraécteres ) !

    Donc en Sortie il faut avoir :
    code_mot : 1
    calu : !

    code_mot : 2
    calu : ?

    code_mot : 3
    calu : .
    code_mot : 3
    calu : .
    code_mot : 3
    calu : .

    code_mot : 4
    calu : j
    code_mot : 4
    calu : u
    code_mot : 4
    calu : l
    code_mot : 4
    calu : i
    code_mot : 4
    calu : e
    code_mot : 4
    calu : n

    j'ai esssayer mais mon code me renvoie toute la ligne et du coup ne respecte pas la sortie demandée :
    mon programme m'affiche :
    code_mot : 1
    calu : !
    code_mot : 2
    calu : ?
    code_mot : 3
    calu : ...
    code_mot : 4
    calu : julien
    code_mot : 5
    calu : julo
    code_mot : 6
    calu : julieno

    Mon code :
    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
    #include <stdio.h>
     
    int main(){
    char *ch[];
    int s;
       int nb;
        FILE *fichier = NULL;
     
        fichier = fopen("lexique.fr", "r");
     
        if (fichier != NULL)
        {     
     
        while( (s= fscanf(fichier,"%d %s",&nb,ch)) != -1){
        printf("%s\n",ch);
        }
       }
     
    }
    Remarque : le prof a dit qu'il faut lire toute la ligne , recuperer le code_mot et apres recuperer les caracteres du mot avec un buffer et il faut prendre en compte l'encodage des caractères (unicode)

    S'il vous plait , aidez moi , j'ai un projet .

    Remarque : on recupere les données pour construire un arbre préfixé qui contient les caracteres trié par alphabet et a comme feuille les code mot .
    Merci beaucoup

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 874
    Points : 39 684
    Points
    39 684

    Par défaut

    Première chose à savoir: Tes lignes, ont-elles une longueur maximale garantie, ou auras-tu besoin d'une fonction de lecture de lignes sans taille maximale?

    Si tu as une longueur maximale garantie, ça ôte déjà une belle épine du pied (et tant que le fichier n'est pas encodé en UTF-16 ou UTF-32, tu peux le lire directement avec fgets() -- ou si ton prof veut de l'Unicode, fgetws()).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 847
    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 : 6 847
    Points : 19 461
    Points
    19 461
    Billets dans le blog
    1

    Par défaut

    Bonjour
    char *ch[] => pourquoi pas (après-tout, on peut admettre que tu aies besoin d'un tableau de pointeurs). Mais dans ce cas, tu ne peux pas écrire ensuite fscanf(fichier,"%d %s",&nb,ch) car "ch" ce n'est pas une chaine...
    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

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : janvier 2019
    Messages : 6
    Points : 2
    Points
    2

    Par défaut probleme

    Merci beaucoup pour vos réponses
    mais en fait , il faut recupere les codes et les suites des caracteres séparement .
    Est ce qu'il n y a de possibilités de recuperer le code mot et la suite des caracteres separement
    (genre on fait une fonction qui recupere le caractere courant , et dans le main on recupere le code mot et on appelle la fonction pour recuperer la suite des caracteres .) ?

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 847
    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 : 6 847
    Points : 19 461
    Points
    19 461
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par juloji Voir le message
    mais en fait , il faut recupere les codes et les suites des caracteres séparement .
    Rien ne t'empêche récupérer toute la ligne (fgets())... puis ensuite d'extraire les diverses infos de la ligne (strtok_r())...

    Citation Envoyé par juloji Voir le message
    Est ce qu'il n y a de possibilités de recuperer le code mot et la suite des caracteres separement
    Ben me semble que c'est ce que fait déjà fscanf(fichier,"%d %s",&nb,ch).

    Faudrait que tu sois plus clair quoi...
    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

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : janvier 2019
    Messages : 6
    Points : 2
    Points
    2

    Par défaut probleme

    merci pour votre réponse ,
    Nom : aazza.png
Affichages : 71
Taille : 192,7 Ko
    mais il faut recuperer les mots caractere par caractere en fait .

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 847
    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 : 6 847
    Points : 19 461
    Points
    19 461
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par juloji Voir le message
    mais il faut recuperer les mots caractere par caractere en fait .
    Pourquoi ? Si tu as une string contenant "pomme_de_terre", tu n'es pas capable de récupérer 'p', 'o', 'm', 'm', 'e' et etc ???

    Le truc a été justement fait pour te faciliter la vie. Parce qu'au lieu d'avoir une ligne contenant "45 pomme de terre" (ce qui te ferait bien suer à cause des espaces en nombre non prévisible), la ligne contient "45 pomme_de_terre". Ainsi il n'y a qu'un espace qui sert de séparateur.
    Donc soit tu utilises fgets() pour récupérér la ligne, puis strtok_r() pour la splitter sur l'espace afin de récupérer "45" d'un côté (qu'il faudra ensuite convertir en int via atoi()) et "pomme_de_terre" de l'autre ; ou bien tu peux comme tu l'as tenté utiliser fscanf() pour stocker le nombre 45 et la chaine "pomme_de_terre" dans deux variables distinctes (pourvu que tu ne chies pas dans le paté en foirant la définition desdites variables).
    Ensuite dans tous les cas il faudra analyser la chaine "pomme_de_terre" caractère par caractère (en traitant le '_' à part) mais ça c'est une autre histoire que je te conseille de traiter dans une autre fonction.
    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

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : janvier 2019
    Messages : 6
    Points : 2
    Points
    2

    Par défaut probleme

    et pour les caracteres speciales comme "é,è,'"
    il faut un encodage unicode

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 847
    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 : 6 847
    Points : 19 461
    Points
    19 461
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par juloji Voir le message
    et pour les caracteres speciales comme "é,è,'"
    il faut un encodage unicode
    Citation Envoyé par Médinoc Voir le message
    ou si ton prof veut de l'Unicode, fgetws().
    Voilà.
    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

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : janvier 2019
    Messages : 6
    Points : 2
    Points
    2

    Par défaut probleme

    Merci pour votre réponse monsieur,
    j'ai trouver une solution pour la recuperation en UTF8
    mais là je recupere tout fichier ligne par ligne alors que je veux recuperer les mots daans ch et les nombres dans nb :
    j'ai utilisé fgetwc pour recuperation , et putwchar pour l'affichage
    là je bloque sur le decoupage avec strtok_r
    où j l utilise exactement pour decouper la sortie du fgetwc
    merci beéaucoup
    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
     
     
    #include <stdio.h>
    #include <wchar.h>
    #include <stdlib.h>
    #include <locale.h>
     
     
    int main(void)
    {
        /* If your native locale doesn't use UTF-8 encoding 
         * you need to replace the empty string with a
         * locale like "en_US.utf8"
         */
        char *locale = setlocale(LC_ALL, "");
        char ch; // là je veux recuperer les mots caractere par caractere 
        int nb=-1;  // là pour recuperer le code 
        FILE *in = fopen("lexique.fr", "r");
        wchar_t c;
        while ((c = fgetwc(in)) != WEOF) {   	// là , la fonction fgetwc me recupere les lignes en utf8				  	
    		putwchar(c);
    	}
    }
    aidez moi s il vous plait

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 847
    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 : 6 847
    Points : 19 461
    Points
    19 461
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par juloji Voir le message
    mais là je recupere tout fichier ligne par ligne alors que je veux recuperer les mots daans ch et les nombres dans nb :
    Ben oui. C'est ce que je me tue à t'expliquer. Une fois que tu as une ligne, tu utilises strtok_r() pour la découper sur un séparateur (par exemple l'espace) pour en extraire les chaines situées avant chaque espace. Puis une fois que tu as chaque chaine, tu peux les copier l'une dans "ch" et l'autre dans "nb".

    Il faut bien entendu lire la doc de strtok_r() pour savoir s'en servir car on doit l'appeler plusieurs fois pour traiter toute la chaine. Donc il lui faut un moyen pour qu'elle sache à quel appel elle en est. Ainsi, au premier appel il faut lui passer la chaine originelle mais aux autres il faut lui passer NULL pour qu'elle comprenne qu'elle doit continuer son travail sur l'appel précédent. Et il faut lui passer l'adresse d'un pointeur qui lui sert à mémoriser son travail en cours pour pouvoir y revenir à l'appel suivant.

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <string.h>
     
    int main() {
    	char chaine[]="Hello:World:I'm here for a long time !!!";
    	char *work=NULL;
    	char *res;
     
    	while ((res=strtok_r(work != NULL ?NULL :chaine, ":", &work)) != NULL)
    		printf("res=[%s], work=[%s]\n", res, work);
    }
    Donc là, j'utilise le fait que "work" (qui sera modifié par la fonction) est initialisé à NULL pour détecter si je suis au premier appel ou pas.

    Citation Envoyé par juloji Voir le message
    j'ai utilisé fgetwc pour recuperation , et putwchar pour l'affichage
    Ok. Donc là c'est caractère par caractère. Moins efficace dans la mesure où il faut alors tout reconstruire à l'arrivée. Mais possible aussi de faire de cette façon...

    Citation Envoyé par juloji Voir le message
    là je bloque sur le decoupage avec strtok_r où j l utilise exactement pour decouper la sortie du fgetwc
    Ben oui. strtok_r() est fait pour découper des chaines. Or là, tu n'as pas de chaine !!! fgetwc() ne te récupère pas une chaine mais un caractère !!!
    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

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 874
    Points : 39 684
    Points
    39 684

    Par défaut

    Si on travaille sur des chaînes "wide", il faudrait utilise wcstok_r() au lieu de strtok_r()... Malheureusement wcstok_r() n'existe pas forcément. Par contre, apparemment le standard C11 supporte wcstok_s(), qui accepte en plus la taille de buffer de la chaîne à séparer:
    Code C11 : Sélectionner tout - Visualiser dans une fenêtre à part
    wchar_t *wcstok_s(wchar_t * restrict s1, rsize_t * restrict s1max, const wchar_t * restrict s2, wchar_t ** restrict ptr);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. SQL ->-> Recupérer des données d'un champ en C++
    Par bogizo dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/05/2007, 14h48
  2. Réponses: 8
    Dernier message: 05/02/2007, 14h28
  3. Réponses: 12
    Dernier message: 04/01/2007, 18h31
  4. Réponses: 2
    Dernier message: 29/05/2006, 00h31
  5. Réponses: 2
    Dernier message: 20/01/2005, 16h19

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