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 :

Rechercher une chaine dans un tableau


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Rechercher une chaine dans un tableau
    Bonjour,
    Je travaille sur un projet dont le but est d'extraire les informations utiles d'un fichier "dump" (de crash), afficher en .txt.
    J'ai déjà réussi à récupérer la ligne contenant l'info recherchée, mais aucune idée de comment récupérer seulement l'info (ici le nom du programme ayant causé l'erreur : "JSAD0G"
    Sachant que le nom change en fonction du fichier EX : ici c'est "JSAD0G" mais dans un autre dump ça peut être "FBQA0L".
    Donc pas de recherche de chaine de caractère possible via strstr.
    Une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE
    Ci dessus la ligne récupérée.
    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
    /*
    		VERSION 3 : - SELECTION DES INFORMATIONS UTILES (FAILING PROGRAM)
    */
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define TAILLE_MAX 1000
     
    int main(int argc, char *argv[])
    {
    	char * string1 = "FAILING PROGRAM"; 							//chaine1
        char * chemin = argv[1]; 									//chemin
        FILE* entree = fopen(chemin, "rb"); 							//Lecture en binaire
        FILE* sortie = fopen("sortie.txt", "wb+"); 						        //Lecture/Ecriture en binaire
    	char chaine[TAILLE_MAX] = "";
    	char chaine2[TAILLE_MAX] = "";
     
    	if (argc != 2) { 												//Si problème de paramètres
            printf("usage: %s fichier\n", argv[0]);									
            return EXIT_FAILURE;
        }
     
    	if(entree != NULL){										 //Lecure ligne par ligne
    		for(int ligne = 1; ; ligne ++){
    			char * resultat = fgets(chaine, TAILLE_MAX, entree);
    			if(resultat == NULL) break;
     
    			if (strstr(chaine, string1) != NULL){					//Recherche de la chaine demandée
    				fprintf(sortie, "%s", chaine);				        //Ecriture dans fichier de sortie (txt)
    			}
    		}
    	}
     
    	else(printf("Fichier introuvable ou impossible a lire\n"));
    	fclose(entree);
    	fclose(sortie);
    }
    Puis mon code.


    PS : Si vous vous demandez pourquoi je lis et j'écris en binaire, car le ficher dump de base est en hexa ou binaire et est mal convertit, donc impossible à lire autrement. D'où les caractères bizarres en début de ligne.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Cela semble [très] simple : c'est 1 fichier CSV, mais sous forme colonne et espace
    Mais compliqué : la grosse difficulté c'est que les données peuvent avoir des espaces.

    Donc la question : est-ce que les colonnes sont créées avec des espaces ou des tabulations ?

    Sinon, tu peux faire 1 parser "machine à états/ automate" ou plus simplement à coup de strchr/ strcpy/ strncpy (<- regarde l'entête string.h, tous des liens cplusplus.com en anglais)

  3. #3
    Membre à l'essai
    Homme Profil pro
    maths sup
    Inscrit en
    Mars 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : maths sup

    Informations forums :
    Inscription : Mars 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour, il suffit d'écrire une fonction qui découpe ta chaîne en un tableau de mots, tu pourras ensuite récupérer le bon.

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par metallica42 Voir le message
    Bonjour, il suffit d'écrire une fonction qui découpe ta chaîne en un tableau de mots, tu pourras ensuite récupérer le bon.
    A l'aide de strtok ? Mais sachant qu'il y a plein d"espace entre chaque mot, le délimiteur ne peut pas être seulement " " ?
    Les espaces ne sont pas toujours le même nombre entre chaque mot.

    EDIT : J'ai tester et le nombre d'espace n'influe pas sur le découpage merci bien

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par foetus Voir le message
    Cela semble [très] simple : c'est 1 fichier CSV, mais sous forme colonne et espace
    Mais compliqué : la grosse difficulté c'est que les données peuvent avoir des espaces.

    Donc la question : est-ce que les colonnes sont créées avec des espaces ou des tabulations ?

    Sinon, tu peux faire 1 parser "machine à états/ automate" ou plus simplement à coup de strchr/ strcpy/ strncpy (<- regarde l'entête string.h, tous des liens cplusplus.com en anglais)
    J'ai pas tout compris là mais après avoir regarder qu'est ce qu'un fichier CSV, les colonnes sont séparées par des espaces, mais beaucoup d'espaces et le nombre est assez aléatoire.

  6. #6
    Membre à l'essai
    Homme Profil pro
    maths sup
    Inscrit en
    Mars 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : maths sup

    Informations forums :
    Inscription : Mars 2018
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ElouanB Voir le message
    A l'aide de strtok ? Mais sachant qu'il y a plein d"espace entre chaque mot, le délimiteur ne peut pas être seulement " " ?
    Les espaces ne sont pas toujours le même nombre entre chaque mot.
    Je parlais plutôt d'utiliser, comme le suggérais foetus, une machine a état, mais basiquement, il suffit de boucler tant que le caractère lu est un blanc, et sinon, d'ajouter le caractère au mot courant.

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par metallica42 Voir le message
    Je parlais plutôt d'utiliser, comme le suggérais foetus, une machine a état, mais basiquement, il suffit de boucler tant que le caractère lu est un blanc, et sinon, d'ajouter le caractère au mot courant.
    Un exemple ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ElouanB Voir le message
    les colonnes sont séparées par des espaces, mais beaucoup d'espaces et le nombre est assez aléatoire.
    Et donc chaque colonne a 1 taille (nb de caractères)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE
    <- 33                        -><- 28                     -><- 11    -><- 21              ->
    Seul toi peut savoir où commencent et finissent les colonnes , je remets ma réponse (tu as des exemples dans mes liens )
    ou plus simplement à coup de strchr/ strcpy/ strncpy (<- regarde l'entête string.h, tous des liens cplusplus.com en anglais)

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2020
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par foetus Voir le message
    Et donc chaque colonne a 1 taille (nb de caractères)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE
    <- 33                        -><- 28                     -><- 11    -><- 21              ->
    Seul toi peut savoir où commencent et finissent les colonnes , je remets ma réponse (tu as des exemples dans mes liens )
    Mais les espaces sont comptés comme des caractères ?
    Si c'est le cas il vont être compter dans mon tableau non ?

    La fonction strtok me parrait plus simple, elle est utilisable ici ?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ElouanB Voir le message
    Si c'est le cas il vont être compter dans mon tableau non ?
    qu'est-ce que tu crois qu'il y a à la place d'1 espace dans 1 fichier ? 1 trou

    En C, c'est l'encodage ASCII, et l'espace c'est 0x20. Et en C, chaque chaîne de caractères doit être terminée par la sentinelle '\0'.

    Va apprendre les chaînes de caractères en C. Sur developpez, il doit y avoir des tutoriels


    Citation Envoyé par ElouanB Voir le message
    La fonction strtok me parrait plus simple, elle est utilisable ici ?
    strtok, lien cplusplus en anglais avec exemple et elle est dans l'entête string.h, comme je l'avais dit

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ElouanB Voir le message
    La fonction strtok me parrait plus simple, elle est utilisable ici ?
    Tout à fait. Mais je te conseillerais plutôt strtok_r() pour t'habituer à toujours l'utiliser par la suite.
    La première utilise un pointeur interne statique pour mémoriser son état. Et donc à l'appel suivant elle peut repartir de là où elle en était. Sur le papier ça semble bien sauf qu'une variable statique étant unique dans la mémoire, tu ne pourras pas l'utiliser pour découper puis sub-découper (exemple d'un PATH qui contient des chemins séparés par ":", puis chaque chemin contient des dossiers séparés par un "/"). Si tu tentes un truc style
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (strtok(..., ":") {
        while (strtok(..., "/") {
            ...
        }
    }
    le truc se vautre totalement. On dit que c'est une fonction "non réentrante". Et si jamais tu veux l'utiliser en parallèle dans différents threads...

    Pour strtok_r() ("r" pour "réentrant") c'est à peine différent. C'est juste que c'est à toi de créer le pointeur mémorisant l'état courant puis le passer à la fonction. Ainsi si t'as 2 découpages imbriqués, te suffit de créer 2 pointeurs et utiliser tantôt le premier, tantôt le second. C'est à peine plus difficile mais d'une part ça marche (les deux pointeurs étant différents, pas de mélange en interne) et t'y mettre maintenant te donnera alors l'habitude.
    Exemple pour le PATH
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char* pt[2];
    while (strtok_r(..., ":", &pt[0]) {
        while (strtok_r(..., "/", &pt[1]) {
            ...
        }
    }
    Voilà, même pas plus compliqué que ça.

    Citation Envoyé par ElouanB Voir le message
    Je travaille sur un projet dont le but est d'extraire les informations utiles d'un fichier "dump" (de crash), afficher en .txt.
    Est-ce que le C est vraiment obligatoire dans ce projet ? Parce que ce n'est pas le langage le plus adapté à ce genre de travaux. Oh certes il peut le faire (il est Turing complet comme les autres) mais certains autre langages t'offriront des outils déjà intégrés (recherche dans les strings, dans les tableaux) que tu n'auras donc pas à recréer comme en C...
    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. Réponses: 10
    Dernier message: 05/01/2008, 11h59
  2. [VBA]Rechercher une chaine dans une cellule?
    Par ZIED dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/01/2006, 05h31
  3. [vbexcel]Rechercher une chaine dans une autre chaine...
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/12/2005, 13h49
  4. Comment rechercher une chaine dans plusieurs tables ?
    Par tsing dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/11/2005, 18h04
  5. [Tableaux] Recherche d'une chaine dans un tableau
    Par tom06440 dans le forum Langage
    Réponses: 5
    Dernier message: 20/10/2005, 23h27

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