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 :

Recuperer la fin d'une chaine de caractere situe dans un fichier texte


Sujet :

C

  1. #1
    Membre régulier Avatar de Lucas42
    Inscrit en
    Janvier 2006
    Messages
    301
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 301
    Points : 97
    Points
    97
    Par défaut Recuperer la fin d'une chaine de caractere situe dans un fichier texte
    Bonjour , je dispose d'un fichier texte dans lequel se trouve des donnees de sauvegarde
    PROCESS/DB_JET_TABLE_HMI.DST_6_SPD40;36
    PROCESS/DB_JET_TABLE_HMI.DST_6_SPD42;132
    PROCESS/DB_JET_TABLE_HMI.DST_6_SPD44;0
    ...
    La chaine situe avant le delimiteur ';' correspond au nom de ma variable , et j'arrive bien a la recuperer grace a la fonction STRNCPY .

    Par contre comment faire pour recuperer les caracteres situes apres ';'

    Merci d'avance
    Amis programmeurs

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Une fois la position du ; connue (strchr() par exemple, ou une constante s'il est toujours a la meme place), il suffit d'incrementer cette position de 1 pour avoir une chaine de caractere valide a envoyer a strcpy() ou strtol(). Un exemple simple, ou l'on convertit la chaine de caractere apres ';' en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char mystring[] = "PROCESS/DB_JET_TABLE_HMI.DST_6_SPD40;36";
    char *pos = strchr(mystring, ';');
    if (pos != NULL)
    {
       char *p;
       long number = strtol(pos + 1, &p, 10);
     
       if (*p != '\0')
       {
          fprintf(stderr, "Could not convert %s to integer.\n", pos + 1);
          ...
       }
    }

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Puisque tu utilises strncpy, je suppose que tu connais la longueur de la chaîne précédant le ';' disons N
    - lit une ligne du fichier dans un tableau tab
    - en tab commence ton PROCESS...
    - en tab+N tu as le ;
    - La donnée que tu cherches à lire commence en tab+N+1
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Bonjour,

    Faudrait que tu montres ton code pour visualiser comment tu récupères le texte dans ton fichier.

    Citation Envoyé par Lucas42
    La chaine situe avant le delimiteur ';' correspond au nom de ma variable , et j'arrive bien a la recuperer grace a la fonction STRNCPY .

    Par contre comment faire pour recuperer les caracteres situes apres ';'
    L'utilisation de strncpy() peut très bien fonctionné à nouveau si tu incrémentes correctement le paramètre "Source string".

    Sinon, tu peux toujours jeter un coup d'oeil sur la fonction strtok() avec comme délimitteur le ";".


  5. #5
    Membre régulier Avatar de Lucas42
    Inscrit en
    Janvier 2006
    Messages
    301
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 301
    Points : 97
    Points
    97
    Par défaut
    Voici le code aue j'utilise pour lire mon fichier texte
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include "apdefap.h"
    void Tag_Listen()
    {
     
     
    // chemin d'accès pour le fichier de journalisation
    char FileName[255]="D:\\Project\\"; 
    char Chaine_Ent[255];
    char Nom_Var[255];
     
    char *str;
    char c=';';
    char *ptr;
     
    // Pointeur de fichier
    FILE *stream; 
     
    // mémoire intermédiaire pour la variable process
    WORD Tag_1; 
    int n=0;
     
    // Lecture du nom du fichier "Test_Write_Var.txt"
    // Ce nom peut être indiqué manuellement via un champ d'entrée/sortie.
     
    strcat(FileName, "Test_Write_Var.txt"); //type de valeur en retour :char* 
     
    // Création/ouverture du fichier de sortie pour la journalisation.
    stream = fopen( FileName, "r" ); 
     
    fgets(Chaine_Ent,40,stream);
    i=strlen(Chaine_Ent);
    str = Chaine_Ent;
    ptr = strchr(str,c);
    strncpy(Nom_Var,Chaine_Ent,(ptr-str));
     
    SetTagChar(TAG_2,Nom_Var);	//Return-Type: BOOL 
    SetTagDWord(TAG_1,(ptr-str));	//Return-Type: BOOL 
     
    /*for (n = 0;n<40;n++)
    {
     
    }*/
     
    // Lecture de la variable process
    // type de valeur en retour :WORD
     
    //Tag_1 = GetTagWord("PROCESS/DB_JET_TABLE_HMI.DST_6_SPD40"); 
    //Tag_2 = GetTagWord("PROCESS/DB_JET_TABLE_HMI.DST_6_SPD42"); 
    // Affichage de contrôle dans une fenêtre de diagnostic Global Script
    printf("Contenu FileName : %s\r\n", FileName); 
     
    // Ecriture de la valeur de la variable dans un fichier
    //fprintf( stream, "PROCESS/DB_JET_PRESET.ACTUAL_PRESET ; %d\r\n", Tag_1 ); 
    //fprintf( stream, "PROCESS/DB_JET_PRESET.ACTUAL_PRESET ; %d\r\n", Tag_2 ); 
    // Fermeture du fichier
    fclose( stream ); 
     
    }
    pour le moment j'arrive a lire le contenu de la premiere ligne mais n'arrive pas a separer les 2 elements separer par ';'

  6. #6
    Membre habitué Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Points : 180
    Points
    180
    Par défaut
    essaie de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    #include <string.h>
     
    int main ()
    {
      char str[40] = "PROCESS/DB_JET_TABLE_HMI.DST_6_SPD40;36";
      char * pch;
      pch=strchr(str,';');//retourn un pointeur vers ';'
      pch++;//pointer sur le caractère suivant
      puts(pch);
      return 0;
    }
    rien pour l'instant

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lucas42 Voir le message
    Par contre comment faire pour recuperer les caracteres situes apres ';'
    Archer t'a quasiment tout dit. Avec strchr() il récupère dans "pch" le pointeur de ta chaîne qui est sur le caractère ';'. Il te suffit de faire un
    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]

  8. #8
    Membre régulier Avatar de Lucas42
    Inscrit en
    Janvier 2006
    Messages
    301
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 301
    Points : 97
    Points
    97
    Par défaut
    Merci ARCHER , ta methode marche nickel .
    Mais jai encore un petit soucis , vois tu , ma chaine aue tu a appelle STR na pas une taille definie .
    Donc prenons l'exemple ou STR est definie de la sorte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char str[40] = "PROCESS/DB_JET_TABLE_HMI.DST_6_SPD40;36";
    cela veut dire aue je peut recuperer apres ';' des chiffres au format XX , et non pas XXX.

    Or comme je recupere
    PROCESS/DB_JET_TABLE_HMI.DST_6_SPD40;36
    grace a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(Chaine_ENT,40,stream)
    je suis limite ..

    Comment faire pour pouvoir renseigne la longueur de ma chaine dans le fgets et non pas une valeur en dur , ici 40 ???

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lucas42 Voir le message
    Comment faire pour pouvoir renseigne la longueur de ma chaine dans le fgets et non pas une valeur en dur , ici 40 ???
    Tu peux pas. Soit tu "estimes" que ta ligne (car fgets() récupère une ligne et non une simple chaîne) ne dépassera jamais une certaine taille (par exemple 100 ou 200 ou 500 ou 1024 ou ...) et tu définis ta chaîne de cette taille, soit tu passes par un autre système comme getline() (qu'on ne trouve pas partout) ou bien du fgetc() à répétition avec agrandissement régulier de la zone de stockage à coups de realloc(). Ou bien alors tu entres dans les "usines à gaz" telles que
    1) je lis pour compter combien j'ai de caractères pour ma ligne
    2) j'alloue de la mémoire
    3) je recule dans mon fichier d'autant
    4) je lis ma ligne pile-poil allouée
    5) je traite ma ligne
    6) je libère la mémoire allouée
    Ce qui devient vite un code assez lourd...

    Mais si tu pars sur la soluce "taille limite = 1024", t'auras aucun soucis pour tout ce qui est inférieur à cette taille car fgets() s'arrête à chaque '\n' (fin de ligne)...
    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]

  10. #10
    Membre habitué Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Points : 180
    Points
    180
    Par défaut
    ici tu effectues une lecture ligne par ligne au cas où les lignes ne dépassent pas la longueur de la chaîne chaîne_ENT mets 255 au lieu de 40 ou même plus mais tu dois changer la longueur de ta chaîne dans la déclaration puis ajoutes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaîne_ENT[strlen(chaîne_ENT)-1]=’\0’ ;
    pour enlever le retour à la ligne .
    ensuite appliques le reste
    NB: strlen() est prototype dans sdtlib.h
    rien pour l'instant

  11. #11
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    A noter que fgets peut ne lire qu'une partie d'une ligne si celle-ci est trop longue pour entrer dans le tableau tab prévu. On peut savoir si c'est le cas parce qu'alors, le tableau ne contiendra pas le \n :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[strlen(tab)-1]!= '\n'
    Toujours dans ce cas, le prochain fgets lira la suite de la ligne tronquée. On peut donc, en plusieurs étapes, lire (ou reconstituer) la ligne entière.

    Dans ton cas, si le nombre de caractères des PROCESS...est fixé, tu peux tirer avantage de ce comportement mais de toute façon, il est vraisemblable que largement dimensionner le tableau devrait suffire.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  12. #12
    Membre régulier Avatar de Lucas42
    Inscrit en
    Janvier 2006
    Messages
    301
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 301
    Points : 97
    Points
    97
    Par défaut
    Merci a tous pour votre aide . Je clos la discussion .

    Merci encore
    Amis Programmeurs

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

Discussions similaires

  1. [Batch] Rechercher et renommer une chaine de caractère complexe dans un fichier texte
    Par mrcanardwc dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 24/06/2011, 13h02
  2. Ajouter des espaces à la fin d'une chaine de caracteres
    Par kodo dans le forum Général Java
    Réponses: 1
    Dernier message: 22/04/2011, 11h25
  3. Tronquer la fin d'une chaine de caractere
    Par Muetdhiver dans le forum Excel
    Réponses: 6
    Dernier message: 16/03/2010, 11h43
  4. Retirer les espaces à la fin d'une chaine de caracteres
    Par laurentdepibrac dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/06/2009, 14h39

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