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 :

Caractères parasites


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut Caractères parasites
    Bonjour,

    Je suis en difficulté sur un prog :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    /****************************************************************************************/
    /* Contrôle l'existance des process WINWORD et PDFCreator et suppression s'ils existent */
    /* La conversion d'un autre fichier sera impossible s'ils tournent toujours             */
    /****************************************************************************************/
    int supp_process()
    {
    	#define MAXNUM 10
    	#define MAXNOM 20
    	char espacenum[MAXNUM];
    	char espacenom[MAXNOM];
    	FILE *fichierps;
    	char *ps;
    	int no = 0;						
    	int i = 0;
    	int j = 0;
    	int k = 0;
    	int m = 0;
    	int nbps = 0;
    	int lg = 0;
    	char *p1 = espacenom;
     
    	struct entry					/* Paramètres des process à supprimer */
    	{
    		char num[10];
    		char nom[20];
    	};
    	struct entry process[200];		/* Nombre de process max à supprimer */
     
    	/* Lit tous les ps en cours et les copie dans liste_ps.txt */
    	if (system("AINTX\\ps.exe") == 0 && system("AINTX\\ps.exe > liste_ps.txt") == 0)
    	{
     
    		if ((fichierps = fopen("liste_ps.txt","r")) == NULL) 
    		{
    			fputs("\nErreur d'ouverture du fichier liste_ps.txt\r",cr);
    			return 1;
    		}
    		/* Allocation mémoire du pointeur de lecture du fichier temporaire */
    		if ((ps = (char *)malloc(100)) == NULL)
    		{
    			fputs("\nIl y a un probleme d'allocation mémoire du pointeur ps",cr);
    			fclose(fichierps);
    			return 1;
    		}
     
    		/* Lit tous les process en cours */
    		while (fgets(ps,100,fichierps) != NULL && !feof(fichierps))
    		{
    			printf("\nps : %s - %d\r",ps,strlen(ps));
     
    			lg = strlen(ps);
    			for (i=0;i<=lg;i++)
    			{
    				if (strnicmp(ps," ",1) != 0)
    				{
    					switch (no)
    					{
    						case 0 :
    							/* Mémorisation du n° de process */
    							process[nbps].num[j] = *ps;
    							printf("\n%c\r",process[nbps].num[j]);
    							j++;break;
    						case 3 :
    							/* Mémorisation du nom de process */
    							process[nbps].nom[k] = *ps;
    							k++;break;
    					}
    					m = 0;
    				}
    				else
    				{
    					if(m == 0)
    						no++;
    					m = 1;
    				}
    				/* Avance d'un caractère */
    				*ps++;
    			}
    			/* Remplace le dernier caractère par \0 */
    			process[nbps].num[strlen(process[nbps].num)-1] = '\0';
    			process[nbps].nom[strlen(process[nbps].nom)-1] = '\0';
    			/* Passe au process suivant */
    			nbps++;
    			j = 0;
    			k = 0;
    			no = 0;
     
    		}
    		fclose(fichierps);
    		free(ps);
     
    		for(i=0;i<nbps;i++)
    		{
    			strcpy(p1,"IEXPLORE\0");
    			printf("\n%s - process[%d].nom : %d ** Process : %s - %d\r",process[i].nom,i,strlen(process[i].nom),process[i].num,strlen(process[i].num));
    			if(strcmp(process[i].nom,p1) == 0)
    			{
    				printf("\nprocess[%d].num : %s\r",i,process[i].num);
    				printf("\nprocess[%d].nom : %s\r",i,process[i].nom);
    			}
    		}
     
    		printf("\nNombre de process : %d\r",nbps);
    		fprintf(cr,"\nNombre de process : %d\r",nbps);
    	}
    	else
    	{
    		fputs("\nImpossible de lister les process.\r",cr);
    		return 1;
    	}
     
    	return 0;
    }
    Losrque j'affiche le contenu de la structure "process[i].num", dans la dernière boucle for, la dernière valeur n'existe pas et à la place il existe des caractères parasites.
    J'ai dû faire une erreur qqpart mais où ?

    Avez-vous une idée ? Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Une petite précision à la fin du prog je comprae avec le process 'IEXPLORE' au lieu de 'WINWORD' et PDFCreator' uniquement pour les tests du développement (Ce process est facile à tester).

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Caractères parasites
    Citation Envoyé par licorne
    Je suis en difficulté sur un prog :

    Losrque j'affiche le contenu de la structure "process[i].num", dans la dernière boucle for, la dernière valeur n'existe pas et à la place il existe des caractères parasites.
    J'ai dû faire une erreur qqpart mais où ?
    Lorsque tu remplis un tableau de caractères, tant que le 0 n'est pas placé, la chaine est invalide (à moins que le tableau de destination n'ai été rempli de 0 au préalable). L'usage de strlen() sur une chaine invalide invoque donc un comportement indéterminé. Ce qui se passe après n'est plus du C...

    Pour résoudre le problème, il suffit tout simplement de placer le 0 au moment où on sort de la boucle, à la position courante de l'index d'écriture.

    Evidemment, la place doit être suffisante... On connait la taille, donc rien n'empêche de bloquer l'index pour éviter de déborder, ou d'interrompre tout le bazar si on considère que c'est une faute...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Merci pour toutes ces précisions.
    C est un langage que j'aime beaucoup mais je crois que j'ai pris de très mauvaises habitudes à développer plutôt avec php, java ou autres. Ces derniers restent excellent mais tellement différents.

    Bonne journée.

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    2 remarques sur ton code:

    Ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                /* Avance d'un caractère */
                *ps++;
    devrait être écrit comme ceci:
    Puisque tu veux faire bouger le pointeur... A mon souvenir, ce n'est pas un comportement indéfini mais c'est une écriture à éviter...
    Par contre:
    Cela est ok.

    Ensuite, plus grave,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
         /* Allocation mémoire du pointeur de lecture du fichier temporaire */
          if ((ps = (char *)malloc(100)) == NULL)
          {
             fputs("\nIl y a un probleme d'allocation mémoire du pointeur ps",cr);
             fclose(fichierps);
             return 1;
          } 
     
         ....
         ps++;
          ....
     
        free(ps);
    devrait te faire réagir... Comment veux-tu que free s'y retrouve, tu as modifié p!!!!
    En plus tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          while (fgets(ps,100,fichierps) != NULL && !feof(fichierps))
    mais à chaque ligne, ps se fait décaller! Bonjour le débordement mémoire!

    Il faudrait faire:


    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
         /* Allocation mémoire du pointeur de lecture du fichier temporaire */
          if ((ps = (char *)malloc(100)) == NULL)
          {
             fputs("\nIl y a un probleme d'allocation mémoire du pointeur ps",cr);
             fclose(fichierps);
             return 1;
          } 
     
         //Avant ton fgets qui a besoin de la bonne position!!!!
         ps = ps2;
          /* Lit tous les process en cours */
          while (fgets(ps,100,fichierps) != NULL && !feof(fichierps)) 
         ....
         ps++;
          ....
         //A la fin de ton while pour que ps soit de nouveau bien positionner
         ps = ps2;
         }
        ...
        free(ps2);
    Il faut faire attention,
    Jc

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Effectivement, c'est qqchose que j'ai dû voir en cours...

    Merci de me rafraichir la mémoire.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Pour être sûre d'avoir bien compris le code est plutôt le suivant :
    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
    /* Allocation mémoire du pointeur de lecture du fichier temporaire */ 
          if ((ps = (char *)malloc(100)) == NULL) 
          { 
             fputs("\nIl y a un probleme d'allocation mémoire du pointeur ps",cr); 
             fclose(fichierps); 
             return 1; 
          } 
     
         //Avant ton fgets qui a besoin de la bonne position!!!! 
         ps2 = ps; 
          /* Lit tous les process en cours */ 
          while (fgets(ps,100,fichierps) != NULL && !feof(fichierps)) 
         .... 
         ps++; 
          .... 
         //A la fin de ton while pour que ps soit de nouveau bien positionner 
         ps = ps2; 
         } 
        ... 
        free(ps);

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par licorne
    Pour être sûre d'avoir bien compris le code est plutôt le suivant :
    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
    /* Allocation mémoire du pointeur de lecture du fichier temporaire */ 
          if ((ps = (char *)malloc(100)) == NULL) 
          { 
             fputs("\nIl y a un probleme d'allocation mémoire du pointeur ps",cr); 
             fclose(fichierps); 
             return 1; 
          } 
     
         //Avant ton fgets qui a besoin de la bonne position!!!! 
         ps2 = ps; 
          /* Lit tous les process en cours */ 
          while (fgets(ps,100,fichierps) != NULL && !feof(fichierps)) 
         .... 
         ps++; 
          .... 
         //A la fin de ton while pour que ps soit de nouveau bien positionner 
         ps = ps2; 
         } 
        ... 
        free(ps);
    Pourquoi allouer dynamiquement un tableau de taille fixe ?

    De quel droit tu incrémentes ps, surtout en maintenant une taille de 100. Tu ments à ton compilateur. Le comportement est indéterminé. Tu veux faire quoi exactement ? Charger les lignes en mémoire ?

    D'autre part, pour détecter la fin de lecture, on teste la valeur retournée par la fonction de lecture. Ici, c'est fgets(), donc si elle retourne NULL, la fin de lecture est détectée. Avec ton code, feof() est évalué tant que ce n'est pas la fin de lecture. Le comportement est indéfini, car feof() n'est évaluable qu'après qu'une fin de lecture n'ai été détectée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          while (fgets(ps, 100, fichierps) != NULL)
          {
              /* ... */
          }
    tout simplement.

    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Tu veux faire quoi exactement ?
    Je liste les processus dans un fichier.
    Je veux récupérer uniquement les id et les noms dans une structure.
    Donc comme solution je lis chaque ligne caractère par caratère.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par licorne
    Tu veux faire quoi exactement ?
    Je liste les processus dans un fichier.
    Je veux récupérer uniquement les id et les noms dans une structure.
    Donc comme solution je lis chaque ligne caractère par caratère.
    Pourquoi ne pas chercher ce que tu veux dans la ligne avec strstr() ? C'est fait pour...

    Une fois que la ligne contient l'info que tu veux, tu l'analyse en détails...

    A quoi ressemble une ligne ?

    D'une façon générale, il ne faut pas foncer sur le codage sans analyse préalable... Il faut justifier ses choix par rapport à un besoin réel.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Pourquoi ne pas chercher ce que tu veux dans la ligne avec strstr() ?
    Le fichier que je cherche à traiter :
    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
    PID       Time      Mem Proc
    ---       ----      --- ----
    0     1082065:42:33       16 Idle
    4     913426:12:16      128 System
    556   74565:24:16      252 smss
    616   298261:37:04     3452 csrss
    640   1043915:39:44     2204 winlogon
    684   1043915:39:44     3348 services
    696   596523:14:08     1776 lsass
    852   55924:03:12     3008 svchost
    936   130489:27:28     2748 svchost
    1032  633805:56:16    15048 svchost
    1112  74565:24:16     2412 svchost
    1228  111848:06:24     2748 svchost
    1392  335544:19:12     5152 spoolsv
    1684  149130:48:32     4300 Apache
    1764  18641:21:04      120 fsgk32st
    1784  838860:48:00     1024 fsgk32
    1840  167772:09:36     4608 mysqld-nt
    1856  466033:46:40    14528 fssm32
    1896  37282:42:08     2460 LpServiceIPClient
    368   18641:21:04      552 FSMA32
    424   279620:16:00      784 FSMB32
    476   186413:30:40      440 fch32
    544   37282:42:08      416 FAMEH32
    588   372827:01:20    10960 Apache
    608   111848:06:24     1580 SymWSC
    2644  111848:06:24      424 FNRB32
    2752  55924:03:12      292 FIH32
    2760  111848:06:24      724 fsav32
    2924  18641:21:04     2548 alg
    3508  354185:40:16    22864 explorer
    3764  18641:21:04     2104 SOUNDMAN
    3780  223696:12:48     1512 FSM32
    3912  149130:48:32     2296 ctfmon
    4044  55924:03:12     1864 ApacheMonitor
    380   130489:27:28     4236 winmysqladmin
    2796  466033:46:40     2980 editplus
    3108  74565:24:16     1052 cmd
    3056  37282:42:08     2608 wuauclt1
    3452  987991:36:32     2648 mmc
    3492  55924:03:12     1136 cmd
    3464  652447:17:20    16216 IEXPLORE
    3832  37282:42:08     1088 test
    320   18641:21:04     2420 cmd
    3972  37282:42:08      992 killproc
    4076  37282:42:08     2384 cmd
    3268  37282:42:08     1752 PS
    strstr() permet juste de trouver la première occurence d'une chaine connue.
    Je cherche à récuper tous les caractères jusqu'au 1er blanc pour constituer mon id process.
    Puis je cherche la chaine après le 3è blanc qui constitue le nom du process.
    Et ca pour toutes les lignes.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par licorne
    Pourquoi ne pas chercher ce que tu veux dans la ligne avec strstr() ?
    Le fichier que je cherche à traiter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PID       Time      Mem Proc
    ---       ----      --- ----
    0     1082065:42:33       16 Idle
    4     913426:12:16      128 System
    556   74565:24:16      252 smss
    616   298261:37:04     3452 csrss
    <...>
    strstr() permet juste de trouver la première occurence d'une chaine connue.
    Je cherche à récuper tous les caractères jusqu'au 1er blanc pour constituer mon id process.
    strtoul()? Utilise le 2ème paramètre...
    Puis je cherche la chaine après le 3è blanc qui constitue le nom du process.
    avec strchr()
    cherche le 2ème ':' , puis converti les 2 valeurs numériques avec strtoul() (ignore les valeurs, mais interesse-toi au deuxème paramètre),

    Encore plus simple. Cherche le dernier espace evec strrchr(). Tu es presque au début de la chaine finale...

    Bref, réfléchir avant d'agir...

    Allons-y par étape. Le principe est que chaque étape est stable et fonctionelle.

    1 - gestion du fichier :
    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
     
    #include <stdio.h>
     
    #define fname "data.txt"
     
    int main (void)
    {
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          printf ("processing '%s'\n", fname);
          fclose (fp);
       }
       else
       {
          perror(fname);
       }
       return 0;
    }
    2 - lecture ligne à ligne
    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
     
    #include <stdio.h>
     
    #define fname "data.txt"
     
    int main (void)
    {
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          char ligne[128];
          unsigned long count = 0;
     
          printf ("processing '%s'\n", fname);
          while (fgets(ligne, sizeof ligne, fp) != NULL)
          {
             count++;
          }
     
          printf ("%lu lines read\n", count);
          fclose (fp);
       }
       else
       {
          perror(fname);
       }
       return 0;
    }
    3 - filtrage
    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
     
    #include <stdio.h>
     
    #define fname "data.txt"
     
    int main (void)
    {
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          char ligne[128];
          unsigned long count = 0;
     
          printf ("processing '%s'\n", fname);
          while (fgets(ligne, sizeof ligne, fp) != NULL)
          {
             count++;
     
             if (count > 2)
             {
                printf ("processing '%s'", ligne);
             }
          }
     
          printf ("%lu lines read\n", count);
          fclose (fp);
       }
       else
       {
          perror(fname);
       }
       return 0;
    }
    4 - Extraction du PID
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define fname "data.txt"
     
    int main (void)
    {
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          char ligne[128];
          unsigned long count = 0;
     
          printf ("processing '%s'\n", fname);
          while (fgets(ligne, sizeof ligne, fp) != NULL)
          {
             count++;
     
             if (count > 2)
             {
                unsigned long pid;
                char *pname = NULL;
     
    #if 0
     
                printf ("processing '%s'", ligne);
    #endif
     
                pid = strtoul (ligne, NULL, 10);
     
                printf ("pid = %lu", pid);
                if (pname != NULL)
                {
                   printf ("pname = '%s'", pname);
                }
                printf ("\n");
             }
          }
     
          printf ("%lu lines read\n", count);
          fclose (fp);
       }
       else
       {
          perror(fname);
       }
       return 0;
    }
    5 - extraction de pname
    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
    59
    60
    61
    62
    63
    64
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define fname "data.txt"
     
    int main (void)
    {
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          char ligne[128];
          unsigned long count = 0;
     
          printf ("processing '%s'\n", fname);
          while (fgets(ligne, sizeof ligne, fp) != NULL)
          {
             count++;
     
             if (count > 2)
             {
                unsigned long pid;
                char *pname = NULL;
    #if 0
     
                printf ("processing '%s'", ligne);
    #endif
     
                pid = strtoul (ligne, NULL, 10);
     
                printf ("pid = %6lu", pid);
     
                pname = strrchr(ligne, ' ');
     
                if (pname != NULL)
                {
                   pname++;
     
                   /* supprimmer le '\n' */
                   {
                      char *p = strchr (pname, '\n');
     
                      if (p != NULL)
                      {
                         *p = 0;
                      }
                   }
                   printf (" pname = '%s'", pname);
                }
                printf ("\n");
             }
          }
     
          printf ("%lu lines read\n", count);
          fclose (fp);
       }
       else
       {
          perror(fname);
       }
       return 0;
    }
    et voilà...
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Merci c'est sympa d'avoir passé tout ce temps pour m'expliquer une méthode plus sûre et plus claire et qui fonctionne.
    Une dernière question.
    Je ne connaissais pas
    #if 0

    printf ("processing '%s'", ligne);
    #endif
    Peux-tu m'en dire plus ?

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par licorne
    Merci c'est sympa d'avoir passé tout ce temps pour m'expliquer une méthode plus sûre et plus claire et qui fonctionne.
    Une dernière question.
    Je ne connaissais pas
    #if 0
    printf ("processing '%s'", ligne);
    #endif
    Peux-tu m'en dire plus ?
    C'est une façon simple de désactiver une portion de code... Pour le réactiver on remplace 0 par 1, par exemple...
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 401
    Points : 145
    Points
    145
    Par défaut
    Merci pour ton investissement et bonne fin de journée.

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

Discussions similaires

  1. Caractères parasites dans EXCEL
    Par fouineur030 dans le forum Excel
    Réponses: 3
    Dernier message: 21/03/2007, 12h37
  2. caractères parasites ou pas?
    Par celiaaa dans le forum Access
    Réponses: 11
    Dernier message: 19/02/2007, 13h51
  3. Langage C : caractéres parasites de fichiers ascii
    Par FoxLeRenard dans le forum C
    Réponses: 2
    Dernier message: 13/08/2006, 12h15
  4. Réponses: 2
    Dernier message: 15/10/2005, 23h29

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