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 :

recuperation d'une chaine de caractere dans un tableau


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut recuperation d'une chaine de caractere dans un tableau
    Bonjour a tous,
    je suis en train de faire un petit programme pour supprimer les fichiers en double et je galere un peu

    Je travaille sous l'OS linux et j'ai réussi via la commande ls -alR a recuperer les noms de fichiers, date de modif, arborescence et a tout mettre dans un tableau de 8 colonnes et du nombre de lignes qu'il faut de la maniere suivante
    ( sachant que j'ai mis chaque dossier pere qui est avant tous les fichiers contenus dans la colonne 1 de mon tableau en laissant les 7 autres colonnes vides)

    /*
    ./.adobe/Acrobat/7.0/Preferences
    drwxr-xr-x 3 tbouvet eleves 4096 2006-12-12 15:00 .
    drwxr-xr-x 6 tbouvet eleves 4096 2006-12-12 15:00 ..
    drwxr-xr-x 3 tbouvet eleves 4096 2006-12-12 15:00 Collab
    -rw------- 1 tbouvet eleves 3051 2007-06-15 10:48 reader_prefs
    ./.adobe/Acrobat/7.0/Preferences/Collab
    drwxr-xr-x 3 tbouvet eleves 4096 2006-12-12 15:00 .
    drwxr-xr-x 3 tbouvet eleves 4096 2006-12-12 15:00 ..
    -rw------- 1 tbouvet eleves 1367 2007-06-15 10:48 RSS
    drwxr-xr-x 3 tbouvet eleves 4096 2006-12-12 15:00 Collab
    */

    Dans le cas present, le fichier Collab est en double donc je souhaiterais recuperer les noms de dossier pere des deux fichiers en double afin de pouvoir faire une commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rm nom_dossier_pere/Collab
    Pour cela, j'ai mis une structure conditionnelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ptableau[i].colonne8 == NULL
    qui devrait etre valide uniquement si la colonne 8 est nulle donc uniquement si il y a un nom de dossier dans la colonne 1, mais ca ne marche pas; le programme ne considere pas les cases comme etant nulles.

    Est ce que quelqu'un sait pourquoi ces colonnes ne sont pas considérés comme nulles ou comment je pourrais faire autrement pour recuperer le nom de dossier..?

    ci joint la declaration de mon tableau, et la facon dont j'ai récupéré les chaines de caractere provenant d'un fichier texte
    Par avance merci
    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
    typedef struct ligne {                     
    	char colonne1[NB];
    	char colonne2[NB];
    	char colonne3[NB];
    	char colonne4[NB];
    	char colonne5[NB];
    	char colonne6[NB];
    	char colonne7[NB];
    	char colonne8[NB];
    	} ligne;
     
     
    char * avoile;
    	avoile = (char*)malloc(NB*sizeof(char));
    	i=-1;
    	while ( ! feof (moulinette) )
    	{
    		fgets(chaine,NB,moulinette);    // on met ligne par ligne le resultat de ls -alR dans "chaine"
    		tab=strtok(chaine," \n");       //on recupere chaque chaine de charactere de "chaine"
    		i++;
    		j=0;
    		while (tab != NULL)             // tant que le tab n'est pas vide, on continue a prendre des valeurs
    		{
    			strcpy(tmp[j].t,tab);   //on met chaque valeur de tab dans une variable tampon tmp[j] de 0 a 7
    			j++;
    			tab = strtok (NULL," \n");  //on reinitialise tab
    		}
    		if (strlen(tmp[0].t)>strcspn(tmp[0].t,":")) //sctrcspn compte le nombre characteres moins le ":", strlen compte le nombre de characteres => si c un dossier, il se finit par ":", donc on rentre dans cette boucle
    		{
    			avoile = strtok(tmp[0].t,":"); //on met le nom de dossier sans ":" dans une variable tampon
    			strcpy(ptableau[i].colonne1,avoile);  //on met cette variable tampon dans la ligne concernée colonne 1
    		}
    		else
    		{
    			strcpy(ptableau[i].colonne1,tmp[0].t); 	//droits d'execution, lecture
    			strcpy(ptableau[i].colonne2,tmp[1].t);
    			strcpy(ptableau[i].colonne3,tmp[2].t); 	//dossier utilisateur
    			strcpy(ptableau[i].colonne4,tmp[3].t); 	//dossier parent
    			strcpy(ptableau[i].colonne5,tmp[4].t); 	//poids
    			strcpy(ptableau[i].colonne6,tmp[5].t); 	//date de derniere modif
    			strcpy(ptableau[i].colonne7,tmp[6].t); 	//heure de derniere modif
    			strcpy(ptableau[i].colonne8,tmp[7].t); 	//nom du fichier, dossier
    		}
            }

  2. #2
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    a priori je pense pas que ca soit un probleme tres compliqué, je pense que c mon strtok qui cause mon probleme, mais j'arrive pas a trouver d'infos suffisantes sur les tutos et les faq...

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Pourrais-tu poster un morceau de code compilable?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Voila mon programme, avec en piece jointe le fichier listebis.txt qui est le resultat de la commande ls -alR
    Ya le fichier Collab comme j'ai montré dans mon premier post qui est en double (même date et même nom)
    Le code est pas tres bien organisé, si ya un truc que tu comprends pas demande moi

    edit: la partie commentée est la liste des choses qu'il me restait a faire, ca devrait marcher sans probleme une fois que j'arrive a recuperer le nom de dossier

    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define NB 100
    #define NB2 200
     
    typedef struct ligne {                      	//on définit le tableau
    	char colonne1[NB];
    	char colonne2[NB];
    	char colonne3[NB];
    	char colonne4[NB];
    	char colonne5[NB];
    	char colonne6[NB];
    	char colonne7[NB];
    	char colonne8[NB];
    	} ligne;
     
    typedef struct tm {
    	char t[NB];
    	} tm;
     
    int main ()					//définition des valeurs
    {
    	int i=0;
    	int j;
    	int nbc;
    	char nom_rep1[NB];                     //nom du premier repertoire pere
    	char nom_rep2[NB];			            //nom du deuxieme repertoire pere
    	char nom_fich[NB];                     //nom du fichier à supprimer
       	int n;                                  //nombre de lignes de liste.txt qu'on va trouver grace a wc -l
        	FILE * suppression = NULL;
    	n=195; // nombre de lignes 
    	tm tmp[7];
    	char * chaine;
    	chaine = (char*)malloc(NB*sizeof(char));
    	char * tab;
    	tab=(char *)malloc(NB*sizeof(char));
    	ligne * ptableau;
    	ptableau = (ligne*) malloc (n*sizeof(ligne));
    	FILE * moulinette = NULL;
    	moulinette  = fopen("listebis.txt","r");
    	char * avoile;
    	avoile = (char*)malloc(NB*sizeof(char));
    	i=-1;
    	while ( ! feof (moulinette) )
    	{
    		fgets(chaine,NB,moulinette);    // on met ligne par ligne le resultat de ls -alR dans "chaine"
    		tab=strtok(chaine," \n");       //on recupere chaque chaine de charactere de "chaine"
    		if(tab==NULL)                   //si il n'y a aucune chaine de charactere a recuperer, on ne prend rien
    		continue;
    		if(strcmp(tab,"total")==0)      //si le premier charactere est total on ne prend pas non plus
    		continue;
    		i++;
    		j=0;
    		while (tab != NULL)             // tant que le tab n'est pas vide, on continue a prendre des valeurs
    		{
    			strcpy(tmp[j].t,tab);   //on met chaque valeur de tab dans une variable tampon tmp[j] de 0 a 7
    			j++;
    			tab = strtok (NULL," \n");  //on reinitialise tab
    		}
    		if (strlen(tmp[0].t)>strcspn(tmp[0].t,":")) //sctrcspn compte le nombre characteres moins le ":", strlen compte le nombre de characteres => si c un dossier, il se finit par ":", donc on rentre dans cette boucle
    		{
    			avoile = strtok(tmp[0].t,":"); //on met le nom de dossier sans ":" dans une variable tampon
    			strcpy(ptableau[i].colonne1,avoile);  //on met cette variable tampon dans la ligne concernée colonne 1
    		}
    		else
    		{
    			strcpy(ptableau[i].colonne1,tmp[0].t); 	//droits d'execution, lecture
    			strcpy(ptableau[i].colonne2,tmp[1].t);
    			strcpy(ptableau[i].colonne3,tmp[2].t); 	//dossier utilisateur
    			strcpy(ptableau[i].colonne4,tmp[3].t); 	//dossier parent
    			strcpy(ptableau[i].colonne5,tmp[4].t); 	//poids
    			strcpy(ptableau[i].colonne6,tmp[5].t); 	//date de derniere modif
    			strcpy(ptableau[i].colonne7,tmp[6].t); 	//heure de derniere modif
    			strcpy(ptableau[i].colonne8,tmp[7].t); 	//nom du fichier, dossier
    		}
            }
    	nbc=i;  // nombre de lignes du tableau après avoir oté les blancs et les lignes poids total du dossier
    	printf("%d",nbc);					//test nombre de lignes tableau
        for (i=0;i<nbc;i++)
            {
            printf("%s %s %s %s %s %s %s %s\n",
            &ptableau[i].colonne1,
            &ptableau[i].colonne2,
            &ptableau[i].colonne3,
            &ptableau[i].colonne4,
            &ptableau[i].colonne5,
            &ptableau[i].colonne6,
            &ptableau[i].colonne7,
            &ptableau[i].colonne8);
            if (ptableau[i].colonne8 == NULL)
                {
                strcpy(ptableau[i].colonne1,nom_rep1);
                printf("%s \n",nom_rep1);
                }
            else
                {
                for (j=i+1;j<n;j++)
                    {
    				if (ptableau[j].colonne8 == NULL)
    				{
    					strcpy(ptableau[j].colonne1,nom_rep2);
    					printf("%s",nom_rep2);
    				}
    				else if ((ptableau[i].colonne8 == ptableau[j].colonne8) && (ptableau[i].colonne6 == ptableau[j].colonne6))
                        {
                        strcpy(ptableau[i].colonne8,nom_fich);
                        printf("%s",nom_fich);
     
    					/*
    					on a les deux noms de repertoire rep1 rep2
    					recherche rep1
    					scanf de la colonne date du rep1
    					recherche rep2
    					scanf de la colonne date du rep2
    					petit prog de olivier pour changer les heures lettre en heures chiffres
    					petit prog de olivier pour tester le dossier le plus recent
    					NE PAS OUBLIER LE NOM DU DOSSIER LE PLUS RECENT (creation de nouvelle valeur rep_sup)
    					modifier les quelques lignes en dessous pour suppression du rep1 ou du rep2
    					*/
     
                        suppression = fopen("supression.txt", "rw");
                        fprintf(suppression, "#!/bin/csh \n");
                        fprintf(suppression, "rm -i %s/%s; \n",nom_rep1,nom_fich);
                        }
                    }
                }
            }
    	fclose (moulinette);
    	return 0;
    }
    Fichiers attachés Fichiers attachés

  5. #5
    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 Tim_noob Voir le message
    Voila mon programme,
    Tu peux déjà commencer par corriger ça.
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:23: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:90: warning: char format, different type arg (arg 2)
    main.c:90: warning: char format, different type arg (arg 3)
    main.c:90: warning: char format, different type arg (arg 4)
    main.c:90: warning: char format, different type arg (arg 5)
    main.c:90: warning: char format, different type arg (arg 6)
    main.c:90: warning: char format, different type arg (arg 7)
    main.c:90: warning: char format, different type arg (arg 8)
    main.c:90: warning: char format, different type arg (arg 9)
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 9 warnings
    • Il est inutile de mettre un tag aux structures si on ne l'utilise pas. struct tm est réservé par le langage C.
    • Si une fonction n'a pas de paramètres, on le précise avec (void).
    • Les commentaires // ne sont pas portables.
    • Le cast est inutile avec malloc()
    • sizeof (char) vaut 1 par définition
    • Le retour de malloc() doit être testé avant usage.
    • La mémoire allouée doit être libérée après usage.
    • La forme canonique est
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
       
         T *p = malloc (sizeof *p * n);
         if (p != NULL)
         {
            /* usage normal */
       
            /* fin */
            free (p), p = NULL;
         }
      C'est le B.A BA de la gestion dynamique de la mémoire.
    • Idem avec fopen()...
    • " char *avoile" : Les jeux de mots Caram'bar, c'est rigolo 2 minutes, mais ça ne renseigne pas sur la sémantique de l'objet... Bref, ça rend le code ésotérique...
    • Il est inutile (fuite mémoire) d'initialiser 2 fois tmp... Le malloc() est à supprimer.
    • Je rappelle la sémantique de strcpy() : strcpy (destination, source). Je soupçonne une inversion.
    • Pourquoi toutes ces allocations de tableaux de taille fixe ? C'est inutile...

    Ton code corrigé et réorganisé. L'indentation excessive indique qu'il est temps de faire des fonctions. Ca tombe bien la réorganisation selon le principe de la réduction de la portée au minimum, a préparé le code pour ça...
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define NB 100
    #define NB2 200
     
    typedef struct
    /* on définit le tableau */
    {
       char colonne1[NB];
       char colonne2[NB];
       char colonne3[NB];
       char colonne4[NB];
       char colonne5[NB];
       char colonne6[NB];
       char colonne7[NB];
       char colonne8[NB];
    }
    ligne;
     
    typedef struct
    {
       char t[NB];
    }
    tm;
     
    /* définition des valeurs */
    int main (void)
    {
       char *chaine = malloc (NB * sizeof *chaine);
     
       if (chaine != NULL)
       {
    /* nombre de lignes de liste.txt qu'on va trouver grace a wc -l */
          int n = 195;
          ligne *ptableau = malloc (n * sizeof *ptableau);
     
          if (ptableau != NULL)
          {
             FILE *moulinette = fopen ("listebis.txt", "r");
             if (moulinette != NULL)
             {
                char *avoile = malloc (NB * sizeof *avoile);
     
                if (avoile != NULL)
                {
                   int i = -1;
     
    /* on met ligne par ligne le resultat de ls -alR dans "chaine" */
                   while (fgets (chaine, NB, moulinette) != NULL)
                   {
                      tm tmp[7];
     
    /* on recupere chaque chaine de charactere de "chaine" */
                      char *tab = strtok (chaine, " \n");
    /* si il n'y a aucune chaine de charactere a recuperer, on ne prend rien */
                      if (tab == NULL)
                         continue;
    /* si le premier charactere est total on ne prend pas non plus */
                      if (strcmp (tab, "total") == 0)
                         continue;
                      i++;
                      {
                         int j = 0;
    /* tant que le tab n'est pas vide, on continue a prendre des valeurs */
                         while (tab != NULL)
                         {
    /* on met chaque valeur de tab dans une variable tampon tmp[j] de 0 a 7 */
                            strcpy (tmp[j].t, tab);
                            j++;
    /* on reinitialise tab */
                            tab = strtok (NULL, " \n");
                         }
                      }
    /* sctrcspn compte le nombre characteres moins le ":", strlen compte le nombre de characteres => si c un dossier, il se finit par ":", donc on rentre dans cette boucle */
                      if (strlen (tmp[0].t) > strcspn (tmp[0].t, ":"))
                      {
    /* on met le nom de dossier sans ":" dans une variable tampon */
                         avoile = strtok (tmp[0].t, ":");
    /* on met cette variable tampon dans la ligne concernée colonne 1 */
                         strcpy (ptableau[i].colonne1, avoile);
                      }
                      else
                      {
    /* droits d'execution, lecture */
                         strcpy (ptableau[i].colonne1, tmp[0].t);
                         strcpy (ptableau[i].colonne2, tmp[1].t);
    /* dossier utilisateur */
                         strcpy (ptableau[i].colonne3, tmp[2].t);
    /* dossier parent */
                         strcpy (ptableau[i].colonne4, tmp[3].t);
    /* poids */
                         strcpy (ptableau[i].colonne5, tmp[4].t);
    /* date de derniere modif */
                         strcpy (ptableau[i].colonne6, tmp[5].t);
    /* heure de derniere modif */
                         strcpy (ptableau[i].colonne7, tmp[6].t);
    /* nom du fichier, dossier */
                         strcpy (ptableau[i].colonne8, tmp[7].t);
                      }
                   }
    /* nombre de lignes du tableau après avoir oté les blancs et les lignes poids total du dossier */
                   {
                      /* nom du premier repertoire pere */
                      char nom_rep1[NB];
    /* nom du deuxieme repertoire pere */
                      char nom_rep2[NB];
    /* nom du fichier à supprimer */
                      char nom_fich[NB];
     
                      int nbc = i;
    /* test nombre de lignes tableau */
                      printf ("%d", nbc);
                      for (i = 0; i < nbc; i++)
                      {
                         printf ("%s %s %s %s %s %s %s %s\n",
                                 ptableau[i].colonne1,
                                 ptableau[i].colonne2,
                                 ptableau[i].colonne3,
                                 ptableau[i].colonne4,
                                 ptableau[i].colonne5,
                                 ptableau[i].colonne6,
                                 ptableau[i].colonne7, ptableau[i].colonne8);
                         if (ptableau[i].colonne8 == NULL)
                         {
                            strcpy (nom_rep1, ptableau[i].colonne1);
                            printf ("%s \n", nom_rep1);
                         }
                         else
                         {
                            int j;
                            for (j = i + 1; j < n; j++)
                            {
                               if (ptableau[j].colonne8 == NULL)
                               {
                                  strcpy (nom_rep2, ptableau[j].colonne1);
                                  printf ("%s", nom_rep2);
                               }
                               else
                                  if ((ptableau[i].colonne8 ==
                                       ptableau[j].colonne8)
                                      && (ptableau[i].colonne6 ==
                                          ptableau[j].colonne6))
                               {
                                  strcpy (nom_fich, ptableau[i].colonne8);
                                  printf ("%s", nom_fich);
     
    /*
     
                      on a les deux noms de repertoire rep1 rep2
                      recherche rep1
                      scanf de la colonne date du rep1
                      recherche rep2
                      scanf de la colonne date du rep2
                      petit prog de olivier pour changer les heures lettre en heures chiffres
                      petit prog de olivier pour tester le dossier le plus recent
                      NE PAS OUBLIER LE NOM DU DOSSIER LE PLUS RECENT (creation de nouvelle valeur rep_sup)
                      modifier les quelques lignes en dessous pour suppression du rep1 ou du rep2
                    */
                                  {
                                     FILE *suppression =
                                        fopen ("supression.txt", "rw");
                                     if (suppression != NULL)
                                     {
                                        fprintf (suppression, "#!/bin/csh \n");
                                        fprintf (suppression,
                                                 "rm -i %s/%s; \n", nom_rep1,
                                                 nom_fich);
                                        fclose (suppression), suppression = NULL;
                                     }
                                  }
                               }
                            }
                         }
                      }
                   }
                   free (avoile), avoile = NULL;
                }
                fclose (moulinette), moulinette = NULL;
             }
             free (ptableau), ptableau = NULL;
          }
          free (chaine), chaine = NULL;
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Tu peux déjà commencer par corriger ça.
    Oue effectivement, j'avais rajouté les & parceque mon printf marchait pas donc j'avais testé quelques trucs

  7. #7
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    le char a voile c un pote qui me l'a rajouté, j'ai d'ailleurs pas compris l'interet de cette variable, pkoi je peux pas direct faire une copie de la chaine de charactere de strtok vers ma case de tableau..?
    Sinon j'ai pas bien compris la forme canonique de la definition de chaque pointeur
    dans mon cas ca donnerait donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *ptableau = malloc (sizeof *ligne *n)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	void* ptableau = NULL;
        ptableau = malloc(n*sizeof(ligne));

  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 Tim_noob Voir le message
    Sinon j'ai pas bien compris la forme canonique de la definition de chaque pointeur
    dans mon cas ca donnerait donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *ptableau = malloc (sizeof *ligne *n)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	void* ptableau = NULL;
        ptableau = malloc(n*sizeof(ligne));
    Ben non. Dans l'exemple que j'ai donné, T est le type et p est le pointeur.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       ligne *ptableau = malloc (n * sizeof *ptableau);
    comme indiqué dans le correction. En lisant le code, on a du mal à voir que T est le type... Selon mes regles de codage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       ligne_s *p_tableau = malloc (n * sizeof *p_tableau);
    http://emmanuel-delahaye.developpez....tes.htm#malloc
    http://emmanuel-delahaye.developpez.com/codage.htm
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Ah oui okay c'est plus clair

    Sinon

    "Il est inutile de mettre un tag aux structures si on ne l'utilise pas. struct tm est réservé par le langage C. "

    C'est mon pote qui m'a rajouté ca parceque j'arrivais pas a subdiviser ma ligne de chaine de charactere en 8, mais j'ai pas bien compris son fonctionnement
    Peux tu m'expliquer pourquoi il a fait ca, et donc pourquoi ca ne sert a rien de le faire..?

  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 Tim_noob Voir le message
    "Il est inutile de mettre un tag aux structures si on ne l'utilise pas. struct tm est réservé par le langage C. "

    C'est mon pote qui m'a rajouté ca
    "J'ai un ami qui a un problème d'alcool... "
    parceque j'arrivais pas a subdiviser ma ligne de chaine de charactere en 8, mais j'ai pas bien compris son fonctionnement
    Peux tu m'expliquer pourquoi il a fait ca, et donc pourquoi ca ne sert a rien de le faire..?
    Ca ne sert a rien, parce que si on ne le met pas, le code reste correct. C'est comme les parenthèses, on peut en mettre 2 (des fois qu'il y en ai une qui pète),
    mais dans la pratique, une seule suffit !
    En plus, ça n'a aucun rapport avec le problème...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Je n'ai pas le temps de tout regarder, es-tu certain de ton utilisation de strtok():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *avoile = malloc (NB * sizeof *avoile);
     
    /* ... */
     
    avoile = strtok (tmp[0].t, ":");
    Dans tout les cas, on a une fuite de mémoire à ce niveau.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    si si j'te jure c bien mon pote qui m'a fait ca , d'ailleurs c pour ca que je galere un peu avec les strtok c lui qui m'a rajouté tout ca
    faut bien decompresser, on a taffer pendant 9h d'affilée dessus...
    Bref, la t'es en train de me faire enlever un tas de warning pour respecter la norme ANSI, ce qui est deja super, mais ca va aussi me resoudre mon probleme de case de la colonne 8 qui est pas considérée comme NULL..??

  13. #13
    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 Tim_noob Voir le message
    mais ca va aussi me resoudre mon probleme de case de la colonne 8 qui est pas considérée comme NULL..??
    Pourquoi devrait-elle être considérée comme NULL ? Si tu as un problème précis à régler avec strtok(), je te conseille de travailler sur un bout de code qui ne s'occupe que de ce problème, et pas une application avec des malloc() plus ou moins utiles dans tous les sens...
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Je n'ai pas le temps de tout regarder, es-tu certain de ton utilisation de strtok():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *avoile = malloc (NB * sizeof *avoile);
     
    /* ... */
     
    avoile = strtok (tmp[0].t, ":");
    Dans tout les cas, on a une fuite de mémoire à ce niveau.

    Thierry
    C'est un copain qui m'a mis ca, ce strtok sert juste a recuperer la premiere chaine de charactere de la la ligne qui est le nom de dossier et a enlever ":"
    A priori ya aucun probleme au niveau de la recuperation du nom de dossier dans la premiere colonne
    Mais c'est justement la que je pense se situer mon probleme, ca doit sans doute faire quelque chose au niveau des colonnes 2 a 8 alors que je veux qu'elles soient nulles

  15. #15
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pourquoi devrait-elle être considérée comme NULL ? Si tu as un problème précis à régler avec strtok(), je te conseille de travailler sur un bout de code qui ne s'occupe que de ce problème, et pas une application avec des malloc() plus ou moins utiles dans tous les sens...
    Ben c'est la que j'esperais trouver des infos dans les cours et tutoriels C sur le site par exemple
    Je pensais que lorsque que je choppais le nom de dossier, etant donné que ya rien derriere, il ne peut pas remplir les colonnes 2 a 8 donc elles sont NULL
    Mais il doit y avoir quelque chose que je ne maitrise pas avec strtok

    Je ne sais pas si c'est parcequ'il faut que j'initialise mon tableau au debut ou si la commande strtok met une valeur vide qui n'est pas considérée comme NULL..

  16. #16
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Je crois que tu t'embrouilles là. Le champ colonne8 de ta structure ligne est un tableau de caractères. Comment peut-il valoir NULL? Je rappelle que NULL n'est utilisé que dans un contexte de pointeurs.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  17. #17
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    okay....
    J'aurais pu chercher effectivement dans mon esprit c'etait pareil..
    T'as une idée dans ce cas la de comment je pourrais detecter les lignes ou ya des noms de dossier(même si c'est pas ce qu'il y a de plus simple, je pensais a un truc qui pouvait voir si le premiere charactere de la deuxieme colonne etait 0 1 2 3 4 5 6 7 8 ou 9 et donc dans le cas contraire c'est un dossier mais bon, je suis sur que ya des moyens plus simples)

  18. #18
    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 Tim_noob Voir le message
    C'est un copain qui m'a mis ca, ce strtok sert juste a recuperer la premiere chaine de charactere de la la ligne qui est le nom de dossier et a enlever ":"
    Encore le coup du copain qui n'y connait rien... Tu nous prends pour des andouilles ou quoi ?

    Je t'ai expliqué que ce malloc() était inutile.
    A priori ya aucun probleme au niveau de la recuperation du nom de dossier dans la premiere colonne
    Mais c'est justement la que je pense se situer mon probleme, ca doit sans doute faire quelque chose au niveau des colonnes 2 a 8 alors que je veux qu'elles soient nulles
    C'est toi qui a écrit le code. Tu codes au hasard ? Tu ne comprends pas ce que tu écris ? Dans une application, tu ne dois pas écrire une instruction dont tu ne maitrises pas le sens.

    Reprenons les choses calmement une par une et dans l'ordre.

    1 - Quel est le but de ton programme ?

    OK, c'est expliqué ici.

    2 - Quelle est la méthode envisagée ?

    Ca, c'est moins clair. J'aimerais bien voir un algorithme précis.
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Le fait est que je suis pas tres bon en langage C et que je dois faire ce programme. Mon pote(qui n'est pas imaginaire mais bel et bien reel) m'a aidé sur la plupart des points de ce programme parceque je codais trop innocement justement, et que je ne savais pas quelles fonctions utiliser.
    Il code peut etre de facon pas tres propre, je m'en rend compte maintenant mais il m'a fait beaucoup avancer.
    J'ai recupéré aussi quelques parties directement sur des forums.

    Pour ce qui est de mon probleme, il m'a peut etre donné une solution que j'ai pas encore eu le temps de tester qui serait d'initialiser a null les cases des colonnes 2 a 8 en même temps que je met le nom de dossier dans la colonne 1.

    Enfin, pour la methode que je compte utiliser, je sais pas vraiment si je repond a ta question en disant ca, mais j'espere recuperer le chemin d'acces du premier dossier qui vient, puis de comparer les colonnes 6 et 8 de la ligne suivante avec les colonnes 6 et 8 de toutes les lignes qui viennent (au passage je recupere le chemin d'acces du deuxieme dossier qui contient le deuxieme fichier) puis de continuer a tester la troisieme ligne puis lorsque j'arrive sur un nouveau dossier de rerecuperer ce chemin d'acces et ainsi de suite.

    J'obtiens ainsi le chemin d'acces des deux dossiers contenant les fichiers en double.
    Avec je ne sais plus quelle commande (strtok je crois) je recupere le nom de dossier a partir du chemin d'acces que je met dans la colonne 2 a chaque fois par exemple puis je fais une recherche sur les deux noms de dossier dans les colonnes 8, je compare leur colonne 6 qui correspond a leur derniere date de modif, et ainsi je vois quel dossier est le plus recent et c'est donc le fichier contenu dans ce dossier la que je dois supprimer.

    Je vais donc l'envoyer dans un script suppression de la maniere suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    suppression = fopen("supression.txt", "rw");
                        fprintf(suppression, "#!/bin/csh \n");
                        fprintf(suppression, "rm -i %s/%s; \n",nom_rep,nom_fich);
    puis je change les droits en execution de suppression.txt et il ne reste plus qu'a lancer suppression dans un shell...

    Je ne maitrise vraiment pas parfaitement mon programme, c'est de la que viennent tous mes problemes, mais je pense ne pas etre tres tres loin d'une solution certes sale mais fonctionelle.

    En tout cas, tes conseils m'aident beaucoup et je t'en remercie.

  20. #20
    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 Tim_noob Voir le message
    Le fait est que je suis pas tres bon en langage C
    Aucun rapport. Pour le moment, il faut écrire l'algorithme. C'est de la programmation et de la reflexion, pas du codage.
    et que je dois faire ce programme. Mon pote(qui n'est pas imaginaire mais bel et bien reel) m'a aidé sur la plupart des points de ce programme parceque je codais trop innocement justement, et que je ne savais pas quelles fonctions utiliser.
    Il code peut etre de facon pas tres propre, je m'en rend compte maintenant mais il m'a fait beaucoup avancer.
    J'ai recupéré aussi quelques parties directement sur des forums.
    Je ne comprends pas bien ta façon d'apprendre le C. Tu ne peux rien apprendre de solide et de construit si tu glanes des bribes à droite à gauche comme ça. Il faut absolument suivre un cours sérieux, complet et documenté. Il y a des références (livres, sites) sur ce site (et sur le mien).
    Pour ce qui est de mon probleme, il m'a peut etre donné une solution que j'ai pas encore eu le temps de tester qui serait d'initialiser a null les cases des colonnes 2 a 8 en même temps que je met le nom de dossier dans la colonne 1.
    On en est pas là. Il faut apprendre à prendre du recul, partir de la définition du problème et expliquer comment le résoudre d'une manière très schématique au début, puis, si le choix est correct, de manière plus détaillée par la suite. Si tu te noies dans les détails dès le début, tu vas droit dans le mur.

    Enfin, pour la methode que je compte utiliser, je sais pas vraiment si je repond a ta question en disant ca, mais j'espere recuperer le chemin d'acces du premier dossier qui vient, puis de comparer les colonnes 6 et 8 de la ligne suivante avec les colonnes 6 et 8 de toutes les lignes qui viennent (au passage je recupere le chemin d'acces du deuxieme dossier qui contient le deuxieme fichier) puis de continuer a tester la troisieme ligne puis lorsque j'arrive sur un nouveau dossier de rerecuperer ce chemin d'acces et ainsi de suite.

    J'obtiens ainsi le chemin d'acces des deux dossiers contenant les fichiers en double.
    Voilà. C'est là-dessus qu'il faut travailler, en essayant de transformer cet algorithme 'textuel' en un algorithme plus 'formel' (proche d'un langage de programmation, mais sans les détails).
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. erreur pour une insertion d'une chaine de caractere dans une cellule
    Par amel95140 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/10/2006, 09h09
  2. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  3. Réponses: 10
    Dernier message: 22/05/2006, 11h45
  4. Réponses: 2
    Dernier message: 04/11/2005, 11h35
  5. [Debutant] Mettre une chaine de caractere dans un tableau
    Par bouboussjunior dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/09/2004, 11h33

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