Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage informations texte en c

Sujet résolu
    18 juin 2020 à 14:37:56

    Bonjour à tous,

    Voici mon problème : Je récupère des informations d'un fichier texte grâce à une recherche de chaine de caractères. Le problème est que si la chaine existe plusieurs fois, ça va me l'afficher plusieurs fois aussi... Comment faire pour ne l'afficher qu'une seule fois ?

    Voici mon code :

    /*
    		VERSION 3 : - SELECTION DES INFORMATIONS UTILES (FAILING PROGRAM)
    */
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define TAILLE_MAX 136
    
    char * binstr(char * bin, int lngmax, const char * str){
        	int lngstr = strlen(str);
       		char * ret = NULL;
        	for(int i=0; i<lngmax-lngstr; i++){
            	if(memcmp(bin+i,str,lngstr)==0){
                	ret=bin+i;
                	break;
            	}
        	}
        	return ret;
    }
    
    int main(int argc, char *argv[])
    {
    	char * search[10]; 															//chaine à rechercher
    	search[0] = "FAILING PROGRAM              ";
    	search[1] = "DATE - ";
    	search[2] = "TIME - ";
    	search[3] = "START OF POST PROCESSING RUN FOR DUMP ";
        char * chemin = "./Dumps/dumpJSAD.txt"; 									//chemin
        FILE* entree = fopen(chemin, "rb"); 										//Lecture en binaire
        FILE* sortie = fopen("sortie.txt", "wb"); 									//Ecriture en binaire
    	char chaine[TAILLE_MAX] = "";
    	char  res[100], i=0, j=0;
    
    	if (argc != 1) { 															//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;
    			
    			char * d = binstr(resultat, TAILLE_MAX ,search[3]) ;
    			if(d != NULL){
    				fprintf(sortie, "Numéro de dump : %.4s\r\n", d+strlen(search[3]));	
    			}
    			char * a = binstr(resultat, TAILLE_MAX ,search[0]) ;           		//Recherche de la chaine demandée
    			if(a != NULL){
    				fprintf(sortie, "Programme : %.4s\r\n", a+strlen(search[0])); 	//affiche les 4 caractères du FAILING PROGRAM
    			}
    			char * b = binstr(resultat, TAILLE_MAX ,search[1]) ;
    			if(b != NULL){
    				fprintf(sortie, "Date : %.5s\r\n", b+strlen(search[1]));		//affiche 2fois DATE/HEURE car 2lecture dans le programme
    			}
    			char * c = binstr(resultat, TAILLE_MAX ,search[2]) ;
    			if(c != NULL){
    				fprintf(sortie, "Heure : %.8s\r\n", c+strlen(search[2]));	
    			}	
    		}
    	}
    
    	fclose(entree);
    	fclose(sortie);
    }

    Et autre chose, mon tableau avec les informations à rechercher est MOCHE !!! Mais j'ai essayer de faire ça plus proprement avec une boucle for mais PAS MOYEN !!! HELP !!!:colere:

    Fichier de sortie :

    Numéro de dump : 3589
    Numéro de dump : 3589
    Date : 19MAY
    Heure : 16.36.03
    Programme : JSAD
    Date : 19MAY
    Heure : 16.36.03
    

    Merci pour votre temps <3 ;)

    -
    Edité par ElouanBesnard 18 juin 2020 à 14:39:10

    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2020 à 17:18:06

      Hello,

      Quleque chose dans ce style-là peut-être

      struct s_search {
      	char *searched_value;
      	bool found;
      };
      
      struct s_search search[]={
      	{"FAILING PROGRAM              ",false},
      	{"DATE - ",false},
          {"TIME - ",false},
      	{"START OF POST PROCESSING RUN FOR DUMP ",false};
      };
      
      int nsearch=sizeof(search)/sizeof(search[0]);
      int numline=0;
      FILE *infile=fopen();
      char read_line[MAX_SIZE];
      
      while(fgets(read_line,sizeof(read_line),infile)) {
      	numline++;
      	for(int=0;i<nsearch;i++)
      		if(!search[i].found) {
      			char *rc=binstr(read_line,MAX_SIZE,search[i].searched_value);
      			if(rc) {
      				fprintf(....,rc+strlen(search[i].searched_value));
      				search[i].found=true;
      			}
      		}
      }
      

      -
      Edité par edgarjacobs 18 juin 2020 à 17:35:36

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        18 juin 2020 à 18:28:38

        Serait-ce possible d'avoir quelques explication sur ton programme ?

        Je ne suis pas un expert en c comme tu peux le voir ^^

        Et je ne connais pas bien les structures.

        Merci

        -
        Edité par ElouanBesnard 18 juin 2020 à 18:30:57

        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2020 à 18:33:46

          Que ne comprends-tu pas ? Évidemment, je ne connais pas ton niveau en c.

          Là, j'ai tout mis en vrac, mais les lignes 6 à 28 devraient se trouver dans une fonction.

          Et, si tu ne connais pas les structures, je t'invite à te renseigner. Voir ici, p.ex.

          N'hésite pas à poser des questions précises.

          -
          Edité par edgarjacobs 18 juin 2020 à 18:37:41

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            19 juin 2020 à 9:19:42

            Dans un fonction cad ? Dans une fonction main ou dans une fonction "search" par exemple ?

            Merci pour le lien vers le cours "structures", très facile enfaite ! :D

            Merci

            EDIT :

            Merci pour ta précieuse aide !

            Ca marche.

            Par contre il y a un soucis sur une petite chose : parce exemple le nom du programme est JSAD et la version est 0G. Dans le dump c'est écrit sur la même ligne (JSAD0G).

            Comment récupérer les deux informations séparées ?

            Et quand j'affiche mes infos, je dois afficher seulement 4 caractères pour le nom du prog ("JSAD") et ensuite 8 caractères pour l'heure ("16.36.03"). Avant je faisais ça dans le fprintf avec "%.4s" pour 4 caractères ect ...

            Comment faire maintenant qu'il est dans la boucle ?

            Code :

            /*
            		VERSION 3 : - SELECTION DES INFORMATIONS UTILES (FAILING PROGRAM)
            */
            
            #include <stdio.h>
            #include <string.h>
            #include <stdlib.h>
            #include <stdbool.h>
            #define MAX_SIZE 136
            
            char * binstr(char * bin, int lngmax, const char * str){
                	int lngstr = strlen(str);
               		char * ret = NULL;
                	for(int i=0; i<lngmax-lngstr; i++){
                    	if(memcmp(bin+i,str,lngstr)==0){
                        	ret=bin+i;
                        	break;
                    	}
                	}
                	return ret;
            }
            
            struct s_search {
                char *searched_value;
                bool found;
                int size;
            };
            
            int main(int argc, char *argv[])
            {
            	struct s_search search[]={
                	{"FAILING PROGRAM              ",false,4},
                	{"DATE - ",false,5},
                	{"TIME - ",false,8},
                	{"START OF POST PROCESSING RUN FOR DUMP ",false,4},
                	{"SYSTEM ERROR NUMBER   ",false,11},
            	};
            
            	char *id[sizeof(search)];
            	id[0] = "Prgm : ";
            	id[1] = "Date : ";
            	id[2] = "Heure : ";
            	id[3] = "Ref : ";
            	id[4] = "Ctrl : ";
            
            	int nsearch=sizeof(search)/sizeof(search[0]);
            	int numline=0;
                FILE* infile = fopen("./Dumps/20200529_G00155_004109", "rb");
                FILE* outfile = fopen("sortie.txt", "wb");
                char read_line[MAX_SIZE];
            	
            	if(infile != NULL){
            		while(fgets(read_line,sizeof(read_line),infile)) {
                		numline++;
                		for(int i=0;i<nsearch;i++){
                    		if(!search[i].found) {
                        		char *rc=binstr(read_line,MAX_SIZE,search[i].searched_value);
                        		if(rc) {
                            		fprintf(outfile,"%d-%s%.11s\r\n",numline,id[i],rc+strlen(search[i].searched_value));
                            		search[i].found=true;
                        		}
                    		}
                    	}
            		}
            	}
            	fclose(infile);
            	fclose(outfile);
            }

            j'ai mis un paramètre size dans la structure que j'aimerais utiliser pour remplacer le "11" dans mon printf mais je ne vois pas trop comment faire.

            -
            Edité par ElouanBesnard 19 juin 2020 à 10:40:55

            • Partager sur Facebook
            • Partager sur Twitter
              19 juin 2020 à 15:38:59

              Re,-

              Je vois que tu as ajouté une variable size dans la structure, qui je suppose est la longueur à afficher. Il te suffit donc d'écrire

              fprintf(outfile,"%d-%s%.*s\r\n",numline,id[i],search[i].size,rc+strlen(search[i].searched_value));

              Mais je changerais le nom size en display_size.

              Edit: de même que je changerais found (je sais, c'est moi qui ai écrit ça au départ) en already_displayed.

              Edit encore: je viens de relire ton programme. Tu as apparemment compris les structures, alors pourquoi ne pas y avoir ajouté la variable id ? De plus, que crois-tu que donne sizeof(search) ?

              struct s_search {
              	char *searched_value;
              	char *id;
              	bool found;
              	int size;
              };
               
              
              
              struct s_search search[]={
              	{"FAILING PROGRAM              ","Prgm : ",false,4},
              	{"DATE - ","Date : ",false,5},
              	{"TIME - ","Heure : ",false,8},
              	{"START OF POST PROCESSING RUN FOR DUMP ","Ref : ",false,4},
              	{"SYSTEM ERROR NUMBER   ","Ctrl : ",false,11},
              };
              
              // Et l'affichage qui va avec
              
              fprintf(outfile,"%d-%s%.*s\r\n",numline,search[i].id,search[i].size,rc+strlen(search[i].searched_value));
              


              Edit encore encore: et je changerais id en title_to_display

              -
              Edité par edgarjacobs 19 juin 2020 à 16:07:36

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                22 juin 2020 à 8:50:07

                Bonjour :),

                De retour après ce week-end.

                J'ai effectivement changer les noms et intégré id à la structure, un simple réflexe de ne pas l'avoir fais avant ...

                Ca fonctionne donc parfaitement, cependant il me reste à récupérer les informations qui sont sur une même ligne et sans marqueur spécifique.

                ex : Après "JSAD", il y a "0G" qui est la version et qui est a récupérer séparément.

                Je pensais faire ça avec une fonction qui gère les déplacements sur une chaine de caractère si ça existe ?

                Merci

                EDIT : Après recherche je penses devoir utiliser "fseek" qui permet de se déplacer de + ou - de caractères.

                -
                Edité par ElouanBesnard 22 juin 2020 à 8:59:50

                • Partager sur Facebook
                • Partager sur Twitter
                  22 juin 2020 à 12:43:58

                  Pour trouver les autres informations de la ligne, tu ne peux pas les chercher dans 'read_line' ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 juin 2020 à 13:46:24

                    Si mais avec un décalage spécifique parce que comme je l'ai dis plus haut il n'y a pas de mot clé mais le décalage est toujours le même.

                    Je ne sais pas trop par où commencer pour récupérer ça.

                    Pour aide voici la ligne :

                    *FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE                                          



                    -
                    Edité par ElouanBesnard 22 juin 2020 à 13:54:03

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 juin 2020 à 15:12:01

                      Quand tu dis que le décalage est toujours le même, tu veux dire que la chaîne à récupérer (la version) est située toujours au même endroit (mêmes positions) dans la ligne ? Genre c'est toujours 2 caractères en position 46 et 47 ? Si oui :

                          char version[2];
                          version[0] = read_line[46];
                          version[1] = read_line[47];

                      Si ce n'est pas ça, tu devrais préciser.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 juin 2020 à 15:28:06

                        Oui c'est exactement ça.

                        Je vais tester merci

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 juin 2020 à 16:18:30

                          Hello,

                          Je vois bien une solution qui permet un traitement particulier tout en restant dans un programme "générique": ajouter dans la structure un pointeur sur fonction, qui permet alors un traitement spécifique par entrée trouvée.

                          J'ai repris ton dernier code (en insérant id dans la structure), je l'ai modifié et testé avec le fichier que tu avais fourni dans ce post. Je te laisse l'analyser.

                          #include <stdio.h>
                          #include <string.h>
                          #include <stdlib.h>
                          #include <stdbool.h>
                          #define MAX_SIZE 136
                            
                          char * binstr(char * bin, int lngmax, const char * str){
                                  int lngstr = strlen(str);
                                  char * ret = NULL;
                                  for(int i=0; i<lngmax-lngstr; i++){
                                      if(memcmp(bin+i,str,lngstr)==0){
                                          ret=bin+i;
                                          break;
                                      }
                                  }
                                  return ret;
                          }
                            
                          struct s_search {
                              char *searched_value;
                          	char *id;
                              bool found;
                              int size;
                              void (*other_treatment)(char *);
                          };
                            
                          void displayProgramVersion(char *str) {
                              puts(str);
                          }
                            
                          int main(void) {
                                  struct s_search search[]={
                                      {"FAILING PROGRAM              ","Prgm : ",false,4,displayProgramVersion},
                                      {"DATE - ","Date : ",false,5,NULL},
                                      {"TIME - ","Heure : ",false,8,NULL},
                                      {"START OF POST PROCESSING RUN FOR DUMP ","Ref : ",false,4,NULL},
                                      {"SYSTEM ERROR NUMBER   ","Ctrl : ",false,11,NULL},
                                  };
                               
                                  int nsearch=sizeof(search)/sizeof(search[0]);
                                  int numline=0;
                                  FILE* infile = fopen("20200529_G00155_004109.dump", "rb");
                                  FILE* outfile = fopen("sortie.txt", "wb");
                                  char read_line[MAX_SIZE];
                                   
                                  if(infile != NULL){
                                      while(fgets(read_line,sizeof(read_line),infile)) {
                                          numline++;
                                          for(int i=0;i<nsearch;i++){
                                              if(!search[i].found) {
                                                  char *rc=binstr(read_line,MAX_SIZE,search[i].searched_value);
                                                  if(rc) {
                                                      fprintf(outfile,"%d-%s%.*s\r\n",numline,search[i].id,search[i].size,rc+strlen(search[i].searched_value));
                                                      if(search[i].other_treatment!=NULL)
                                                          search[i].other_treatment(read_line);
                                                      search[i].found=true;
                                                  }
                                              }
                                          }
                                      }
                                  }
                                  fclose(infile);
                                  fclose(outfile);
                          }

                          Évidemment, à toi de modifier displayProgramVersion() pour faire ce que tu veux. Et, bien sur, il est possible de passer d'autres paramètres à la fonction, à condtion de modifier sa déclaration ligne 24

                          -
                          Edité par edgarjacobs 22 juin 2020 à 17:28:38

                          • Partager sur Facebook
                          • Partager sur Twitter

                          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                            23 juin 2020 à 8:37:54

                            robun a écrit:

                            Quand tu dis que le décalage est toujours le même, tu veux dire que la chaîne à récupérer (la version) est située toujours au même endroit (mêmes positions) dans la ligne ? Genre c'est toujours 2 caractères en position 46 et 47 ? Si oui :

                                char version[2];
                                version[0] = read_line[46];
                                version[1] = read_line[47];

                            Si ce n'est pas ça, tu devrais préciser.

                            J'ai essayer ce que tu as donner mais comme je l'imaginais, ça ne marche pas. read_line ne contient pas des caractères mais des lignes. Donc read_line[46] contient la ligne 46.

                            edgarjacobs,

                            Je n'est pas très bien compris la déclaration ligne 24.

                            Ce que ton code fait c'est d'afficher la ligne FAILING PROGRAM dans le terminal pour le moment et je dois donc modifier displayProgramVersion pour qu'il n'affiche que la version ?

                            Comment je peux faire ça ?

                            Merci

                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 juin 2020 à 9:24:38

                              ElouanBesnard a écrit:

                               J'ai essayer ce que tu as donner mais comme je l'imaginais, ça ne marche pas. read_line ne contient pas des caractères mais des lignes. Donc read_line[46] contient la ligne 46.

                               read_line est déclaré ligne 44 comme un tableau de caractères.  C'est un tableau qui sert de tampon pour une ligne. Et qui devrait s'appeler line_read (ligne lue), ou line, ou buffer, et pas read_line (lire ligne) qui est une description d'action.

                              • Quand tu dis que tu as essayé, fais-vois le code. On ne sait pas ce que tu as pu faire à partir des indications qui été suggérées.
                              • quand tu dis que ça ne marche pas, donne une description précise.

                              -
                              Edité par michelbillaud 23 juin 2020 à 9:27:12

                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 juin 2020 à 9:30:37

                                michelbillaud a écrit:

                                ElouanBesnard a écrit:

                                 J'ai essayer ce que tu as donner mais comme je l'imaginais, ça ne marche pas. read_line ne contient pas des caractères mais des lignes. Donc read_line[46] contient la ligne 46.

                                 read_line est déclaré ligne 44 comme un tableau de caractères.

                                • Quand tu dis que tu as essayé, fais-vois le code. On ne sait pas ce que tu as pu faire à partir des indications qui été suggérées.
                                • quand tu dis que ça ne marche pas, donne un description précise.

                                char version[2];
                                version[0] = read_line[46];
                                version[1] = read_line[47];

                                J'ai fais ça et un printf(version); dans la dernière boucle if.

                                if(result) {
                                                		//fprintf(outfile,"%d-%s%.*s\r\n",numline,search[i].title_to_display,search[i].display_size,result+strlen(search[i].searched_value));
                                                		search[i].already_displayed=true;
                                                		char version[2];
                                						version[0] = read_line[46];
                                						version[1] = read_line[47];
                                						puts(version);
                                            		}



                                Ca m'affiche la ligne FAILING PROGRAM entière et la ligne entère SYSTEM ERROR NUMBER ou il y a la date, l'heure ect ...

                                *FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE                                          
                                SYSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR                         DATE - 19MAY      TIME - 16.36.03                 




                                -
                                Edité par ElouanBesnard 23 juin 2020 à 9:32:37

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 juin 2020 à 10:13:51

                                  La fonction (ou macro ?) puts prend comme paramètre une CHAINE de caractères.

                                  C'est à dire, en C, l'adresse d'un octet qui est le début d'une zone contenant les caractères de la chaine, puis le caractère nul qui marque la fin.

                                  Pour stocker une chaine de 2 caractères, il te faut 3 octets.

                                  Si on part sur l'idée de faire ceci

                                  char version[2];
                                  version[0] = read_line[46];
                                  version[1] = read_line[47];

                                  il faut pousser plus loin

                                  char version[3];
                                  version[0] = read_line[46];
                                  version[1] = read_line[47];
                                  version[2] = '\0';
                                                          

                                  Sinon, charcuter dans read_line

                                  char version[3];
                                  read_line[46 + 2] = '\0';
                                  strcpy(version, read_line+46);
                                  






                                  -
                                  Edité par michelbillaud 23 juin 2020 à 10:15:09

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 juin 2020 à 10:21:39

                                    Voici ce que ça m'affichait avant :

                                    TOSYSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR                         DATE - 19MAY      TIME - 16.36.03
                                    
                                    TOSYSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR                         DATE - 19MAY      TIME - 16.36.03
                                    
                                    TOSYSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR                         DATE - 19MAY      TIME - 16.36.03
                                    
                                    D0*FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE
                                    
                                    D0*FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE
                                    

                                    Et voici ce que ça m'affiche maintenant :

                                    TO
                                    TO
                                    TO
                                    D0
                                    D0




                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      23 juin 2020 à 10:23:22

                                      et donc ?

                                      Code source, description du problème, etc.

                                      -
                                      Edité par michelbillaud 23 juin 2020 à 10:26:32

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 juin 2020 à 10:27:10

                                        Je ne comprends pas l’intérêt de ça, je cherche à récupérer ce qui est en milieu de ligne soit "0G" après "JSAD"

                                        /*
                                        		VERSION 4 : - TOUTES LES INFORMATIONS
                                        */
                                        
                                        #include <stdio.h>
                                        #include <string.h>
                                        #include <stdlib.h>
                                        #include <stdbool.h>
                                        #define MAX_SIZE 136
                                        
                                        char * binstr(char * bin, int lngmax, const char * str){
                                            	int lngstr = strlen(str);
                                           		char * ret = NULL;
                                            	for(int i=0; i<lngmax-lngstr; i++){
                                                	if(memcmp(bin+i,str,lngstr)==0){
                                                    	ret=bin+i;
                                                    	break;
                                                	}
                                            	}
                                            	return ret;
                                        }
                                        
                                        struct s_search {
                                            char *searched_value;
                                            char *title_to_display;
                                            bool already_displayed;
                                            int display_size;
                                        };
                                        
                                        int main(int argc, char *argv[])
                                        {
                                        	if (argc != 2) {
                                        	    printf("usage: %s chemin\n", argv[0]);									
                                                return EXIT_FAILURE;
                                            }
                                        
                                        	struct s_search search[]={
                                            	{"FAILING PROGRAM              ","Programme : ",false,4},
                                            	{"DATE - ","Date : ",false,5},
                                            	{"TIME - ","Heure : ",false,8},
                                            	{"START OF POST PROCESSING RUN FOR DUMP ","Référence : ",false,4},
                                            	{"SYSTEM ERROR NUMBER   ","Ctrl : ",false,11},
                                            	{"          +","Déplacement : ",false,9},
                                            	/*{"  R0","R0",false,42},
                                            	{"  R2","R2",false,42},
                                            	{"  R4","R4",false,42},
                                            	{"  R6","R6",false,42},
                                            	{"  R8","R8",false,42},
                                            	{"  R10","R10",false,42},
                                            	{"  R12","R12",false,42},
                                            	{"  R14","R14",false,42}*/
                                        	};
                                        
                                        	int nsearch=sizeof(search)/sizeof(search[0]);
                                        	int numline=0;
                                            FILE* infile = fopen(argv[1], "rb");
                                            FILE* outfile = fopen("sortie.txt", "wb");
                                            char read_line[MAX_SIZE];
                                        	
                                        	if(infile != NULL){
                                        		while(fgets(read_line,sizeof(read_line),infile)) {
                                            		numline++;
                                            		for(int i=0;i<nsearch;i++){
                                                		if(!search[i].already_displayed) {
                                                    		char *result=binstr(read_line,sizeof(read_line),search[i].searched_value);
                                                    		if(result) {
                                                        		fprintf(outfile,"%d-%s%.*s\r\n",numline,search[i].title_to_display,search[i].display_size,result+strlen(search[i].searched_value));
                                                        		search[i].already_displayed=true;
                                                        		char version[3];
                                        						version[0] = read_line[46];
                                        						version[1] = read_line[47];
                                        						version[2] = '\0';
                                        						puts(version);
                                                    		}
                                                		}
                                                	}
                                        		}
                                        	}
                                        	fclose(infile);
                                        	fclose(outfile);
                                        }



                                        -
                                        Edité par ElouanBesnard 23 juin 2020 à 10:28:07

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          23 juin 2020 à 10:39:30

                                          Argh, j'ai oublié le coup du caractère nul ! (Le pire, c'est que je m'en suis immédiatement rendu compte en me relisant...)

                                          Quand je disais « Genre c'est toujours 2 caractères en position 46 et 47 » c'était un exemple, je ne connais pas les positions précises ! (Comme quoi il n'y a pas que moi qui suis distrait :) )

                                          En fait, j'ai l'impression que le contenu des lignes s'affiche à des positions précises. Je reprends ton extrait :

                                          *FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE
                                          0         1         2         3         4         5         6         7         8
                                           123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789

                                          Ça commence par un caractère spécial, puis l'intitulé de l'erreur entre les positions 1 et 29, puis un mot-clé entre 30 et 35, etc. Si c'est le cas pour toutes les lignes, tu dois exploiter cette organisation.

                                          ("0G" est situé aux positions 46 et 47, ça alors ! J'avais pourtant pris ces nombres au hasard... Cela dit tu as obtenu "D0", donc il y a un décalage d'un cran peut-être dû au premier caractère spécial. Du coup ce serait plutôt :

                                          *FAILING PROGRAM              JSAD0G  OBJ-JSAD0G          +00000464  TRC-JSAD LOADSET-BASE
                                          0        1         2         3         4         5         6         7         8
                                           23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789

                                          et c'est peut-être le "0G" en position 35-36 qui t'intéresse, non ? Mais ça, c'est à toi de le déterminer.)

                                          Si tu as plusieurs mots-clés à récupérer (et si c'est bien cette organisation), ça pourrait être une bonne idée de créer une fonction qui retourne (sous forme de paramètre passé par adresse) la sous-chaîne qui commence en position p et de longueur l.

                                          -
                                          Edité par robun 23 juin 2020 à 10:56:21

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            23 juin 2020 à 10:47:09

                                            Aaaaaaaaah j'ai compris ok !

                                            donc si je veux récupérer "OG" je prends les positions 47 et 48.

                                            Ou bien le "OG" en 35-36 peut importe :)

                                            Pourquoi il y a le T0 ? D'où il sort ?

                                            Merci

                                            -
                                            Edité par ElouanBesnard 23 juin 2020 à 10:48:14

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              23 juin 2020 à 10:55:26

                                              D'où sort le TO :

                                              SYSTEM ERROR NUMBER   OPR-I000004   VIRTUAL STORAGE ERROR                         DATE - 19MAY      TIME - 16.36.03
                                              0        1         2         3         4         5         6         7         8
                                               23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789

                                              Position 46-47 : TO.

                                              ----

                                              PS : attention, ce n'est pas OG mais 0G ; ce n'est pas T0 mais TO.

                                              -
                                              Edité par robun 23 juin 2020 à 10:57:34

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 juin 2020 à 11:03:04

                                                Ok je vais détailler mes questions :

                                                Pourquoi ça affiche les caractères 47-48 de la ligne FAILING PROGRAM et de la ligne SYSTEM ERROR NUMBER ?

                                                Comment faire en sorte que ça n'affiche qu'une seule fois 0G et pas TO ?

                                                Est ce que je peux simplifier ça pour le mettre dans mon search ?

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  23 juin 2020 à 11:14:12

                                                  Pour l'instant, ça affiche les caractères 47-48 de toutes les lignes. Si tu veux le faire pour certaines lignes seulement, il faut un critère permettant de reconnaître le type de ligne. Est-ce que tu veux cet affichage que pour les lignes qui commencent par "FAILING PROGRAM" ? Ou que pour une ligne précise et pas les autres ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 juin 2020 à 11:17:13

                                                    robun a écrit:

                                                    Pour l'instant, ça affiche les caractères 47-48 de toutes les lignes. Si tu veux le faire pour certaines lignes seulement, il faut un critère permettant de reconnaître le type de ligne. Est-ce que tu veux cet affichage que pour les lignes qui commencent par "FAILING PROGRAM" ? Ou que pour une ligne précise et pas les autres ?


                                                    Ah ok.

                                                    Il me faut seulement une ligne précise : ici la ligne 38

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      23 juin 2020 à 11:23:17

                                                      Comment ça la ligne 38 ? Tu veux dire que chaque fois que tu utiliseras ce programme pour afficher des infos d'un fichier dump, ce sera la ligne 38 qui contiendra la version ?

                                                      Et qu'est-ce que tu appelles la ligne 38 ? La 38è ligne du fichier d'entrée ? Ou la 38è ligne qui s'affiche ? (38 en comptant à partir de 0, ou à partir de 1 ?)

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        23 juin 2020 à 11:25:42

                                                        Oui voilà dans chaque fichier la version sera toujours à la ligne 38.

                                                        J'ai compté 38 à partir de 1 dans le fichier d'entrée.

                                                        EDIT :

                                                        Je retire ce que je viens de dire, ça n'est pas toujours à la ligne 38 ...

                                                        En tout les cas c'est toujours après le nom du programme.

                                                        Et ducoup oui il me faut cet affichage pour les lignes qui commencent par FAILING PROGRAM sachant qu'il n'y en a qu'une seule dans chaque fichier.

                                                        -
                                                        Edité par ElouanBesnard 23 juin 2020 à 11:31:46

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          23 juin 2020 à 13:09:06

                                                          Du coup tu pourrais faire quelque comme ça (juste après l'affichage de la ligne complète) :

                                                          char mot_cle[20] ;   // 20 ou autre chose...
                                                          char version[3] ;
                                                          extraire(read_line, mot_cle, 2, 15) ;  // 15 = longueur de "FAILING PROGRAM", 2 = sa position (à corriger)
                                                          if (strcmp(mot_cle, "FAILING PROGRAM") == 0)
                                                              { // On est sur une ligne commençant par "FAILING PROGRAME"
                                                              extraire(ligne, version, 47, 2) ;
                                                              /* afficher 'version' */
                                                              }
                                                              
                                                          

                                                          où la fonction 'extraire' serait une fonction ayant ce prototype :

                                                          void extraire(char ligne[], char mot[], int position, int longueur) ;
                                                          

                                                          Elle extrait de la ligne un mot qui commence à la position indiquée et a la longueur indiquée, en n'oubliant pas de terminer ce mot par le caractère nul. Elle sert ici pour extraire le peut-être mot-clé (mot de longueur 15 et de position 2, ou peut-être 3, à vérifier) puis pour extraire la version.

                                                          (Ne recopie surtout pas ça tel quel : je n'ai pas essyayé, les nombres sont à vérifier/corriger, et j'ai utilisé un nom de fonction en français par habitude, contrairement à toi. C'est juste pour donner une idée.)

                                                          -
                                                          Edité par robun 23 juin 2020 à 13:55:03

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            23 juin 2020 à 13:31:07

                                                            Qu'entends tu par juste après l'affichage de la ligne complète ?
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              23 juin 2020 à 13:35:13

                                                              Juste après cette ligne :

                                                              fprintf(outfile,"%d-%s%.*s\r\n",numline,search[i].title_to_display,search[i].display_size,result+strlen(search[i].searched_value));

                                                              À vrai dire je ne me souviens plus ce qu'affiche cette ligne (ce n'est pas mon programme...) Ce n'était pas la ligne complète ? Pas grave. Je voulais dire : là où tu veux afficher une info de plus (la version).

                                                              -
                                                              Edité par robun 23 juin 2020 à 13:37:26

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Affichage informations texte en c

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown