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 :

Stocker un fichier dans un tableau


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Points : 23
    Points
    23
    Par défaut Stocker un fichier dans un tableau
    bonjour,
    je suis debutante en langage c.et je dois ecrire un programme qui permet de stocker un fichier d'une taille variable dans un tableau dynamique.
    mon idée est de
    1. calculer la taille du fichier : le nombre de ses caractères par la fonction nbcaractere()
    2.creer un tableau dynamique qui a comme taille le nombre des caractère de fichier :la fonction convert() va retouner ce tableau de caractère .mais comment recuperer ce tableau dans le main et l'afficher:qlq'un pourra m'aider svp je dois rendre cette exercice deamin merci.voici mon programme :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int nbcaratere(void);
    int main()
    {
    int i,n;
    n=nbcaratere();
    char c;
    printf("la taille est de %d",n);
    for(i=0;i<n;i++)
    {
    c=convert();
    printf("%c",c);
    }
    return 0;
    }
     
    int nbcaratere(void)
    {
    FILE *f;
    f = fopen("c:\\t.txt", "r");
    if (f == NULL) /* ´equivalent `a << if (!f) >> */
    {
    printf("Erreur lors de l’ouverture du fichier!\n");
    }
    else
    {
    int fin;
    fseek(f, 0, SEEK_END);
    fin = ftell(f);
    //printf("Le fichier a une longueur de %i\n", fin);
    fseek(f, 0, SEEK_SET);
    fclose(f);
    return (fin);
    }
     
    }
     
     char convert(void)
    {
    FILE *f;
     
    int i,n, c;
    char *e;
    n=nbcaratere();
    e=(char*)malloc(n*sizeof(char));
     
    f = fopen("c:\\t.txt", "r");
    if (f == NULL) 
    {
    printf("Erreur lors de l’ouverture du fichier!\n");
    }
    else
    {
    do {
     
                c = fgetc (f);
               e[i]=c; 
     
    printf("le caractère est %c",e[i]);
     
     
            } while (c != EOF);
     
    }
    fclose(f);
    return *e;
    free (e);
     
     }

  2. #2
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Points : 276
    Points
    276
    Par défaut
    Ta fonction convert devra tout simplement retourner un char* au lieu de char, et dans ton main, tu fais quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *T;
    T = (char*)malloc((taille_du_fichier)*sizeof(char));
    T = convert();
    Normalement, cela devrait marcher.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ben non, là, tu as une superbe fuite mémoire puisque l'adresse qui vient d'être fournie par le malloc est perdue !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par AjJi Voir le message
    Ta fonction convert devra tout simplement retourner un char* au lieu de char, et dans ton main, tu fais quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *T;
    T = (char*)malloc((taille_du_fichier)*sizeof(char));
    T = convert();
    Normalement, cela devrait marcher.
    le cast du retour de malloc est inutile, qui plus est, sizeof (char) vaut toujours 1.
    2 possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *T = malloc (taille_du_fichier);
    soit, si on veut se préparer au passage à l'unicode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *T = malloc(taille_du_fichier * sizeof *T);
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    Autant lire d'un trait le fichier.
    Par ex avec une fonction:
    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
     
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    char * read_the_file( const char * fname )
    {
       size_t r ;
       char* z = NULL  ;
       FILE * fd = NULL;
     
       struct stat st ;
     
       fd = fopen ( fname , "rb");
       if (fd == NULL)
       { perror ( fname );
         return NULL ;
       }
     
       if( stat( fname, &st ) != 0  )
       {
         perror("erreur dans stat\n") ;
         return NULL ;
       }
     
       z = (char*) malloc( (st.st_size + 1)  * sizeof(char) ) ;
       if( !z  ) return NULL  ;
     
       r = fread( z , sizeof( char ), st.st_size, fd ) ;
       if( r == (size_t) st.st_size )
       { 
          *( z + st.st_size ) = '\0' ;
     
       }
       else
       {
         printf("Impossible de lire %s\n", fname ) ;
         free( z ) ;
         z = NULL ;
       }
     
       if( fd ) fclose(fd) ;
     
       return  z ;
    }
     
    int main()
    { 
      char * z = read_the_file( "toto.txt" ) ;
      if ( z ) ....
    }

  6. #6
    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 dj.motte Voir le message
    Autant lire d'un trait le fichier.
    Par ex avec une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <unistd.h>
    <...>
       struct stat st ;
    Pas standard... De plus, faire un stat() sur un fichier ouvert est une drôle d'idée... Je dirais comportement indéfini, mais je n'ai pas le temps de lire la doc de stat en détail...

    fseek()/ftell()/rewind() devrait suffire ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       z = (char *) malloc ((st.st_size + 1) * sizeof (char));
    A quoi sert le cast ?
    A quoi sert sizeof (char) alors qu'il vaut 1 par définition ?

    Pourquoi écrire du code plus compliqué que nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       z = malloc (st.st_size + 1);
    Tout simplement...

    Par contre, attention à ne pas tomber dans la simplification extrême qui fait faire des âneries :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       if (!z)
          return NULL;
    le fichier n'est pas refermé...

    D'autre part, !z, bien que techniquement correct est peu lisible. Déjà, z est un curieux nom de pointeur. D'autre part, s'agissant d'un pointeur, z == NULL est plus approprié, même si c'est un peu plus long à écrire. Toujours privilégier la relecture du code. Ne pas présumer du niveau de geekness du lecteur potentiel...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          *(z + st.st_size) = '\0';
    Techniquement correct, mais inutilement complexe.
    ou encore
    Je propose ceci :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char *read_the_file (const char *fname)
    {
       char *z = NULL;
       FILE *fp = fopen (fname, "rb");
       if (fp != NULL)
       {
          unsigned long len;
          fseek (fp, 0, SEEK_END);
          len = ftell (fp);
          rewind (fp);
     
          printf ("len = %lu\n", len);
          if (len <= ((size_t) - 1))
          {
             z = malloc (len + 1);
             if (z != NULL)
             {
                if (len == fread (z, 1, len, fp))
                {
                   z[len] = 0;
                }
                else
                {
                   printf ("Impossible de lire %s\n", fname);
                   free (z), z = NULL;
                }
             }
          }
          else
          {
             printf ("the file is too big\n");
          }
          fclose (fp);
       }
       else
       {
          perror (fname);
       }
       return z;
    }
     
    int main (void)
    {
       char *z = read_the_file ("main.c");
       if (z != NULL)
       {
          puts (z);
          free (z);
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Salut,

    J'ai une toute petite question que signifie cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (len <= ((size_t) - 1))
    Si len est inférieur ou égale à la plus grande valeur que peut prendre une variable de type size_t moins un ...???

    Petite remarque il faut peut être un :
    #include <stdlib.h> /* malloc / free */


    @++
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  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 ssmario2 Voir le message
    J'ai une toute petite question que signifie cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (len <= ((size_t) - 1))
    Si len est inférieur ou égale à la plus grande valeur que peut prendre une variable de type size_t moins un ...???
    Oui, c'est presque ça. En fait, (T)-1 représente la plus grande valeur possible d'un type quand celui-ci est non signé (un size_t est un entier non signé). Je crois qu'en C99, il y a une constante pour size_t dans <limits.h> (SIZE_MAX ou SIZE_T_MAX)...

    Petite remarque il faut peut être un :
    #include <stdlib.h> /* malloc / free */
    Oui, merci, c'est corrigé.
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je crois qu'en C99, il y a une constante pour size_t dans <limits.h> (SIZE_MAX ou SIZE_T_MAX)...
    Citation Envoyé par 7.18.3 Limits of other integer types
    limit of size_t
    SIZE_MAX 65535
    SIZE_MAX est définie dans stdint.h.
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et visual C++ supporte aussi SIZE_MAX, bien qu'il ne supporte pas C99.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    unistd.h pas standard. Pourtant on s'en sert souvent dans le monde de Linux.

    Avec Windows est-ce que io.h peut proposer des services équivalents à unistd.h ? Je pose la question car je ne me sers jamais du Visual C de Microsoft.

  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 dj.motte Voir le message
    unistd.h pas standard. Pourtant on s'en sert souvent dans le monde de Linux.
    Et ?
    Avec Windows est-ce que io.h peut proposer des services équivalents à unistd.h ? Je pose la question car je ne me sers jamais du Visual C de Microsoft.
    Moi non plus, donc, aucune idée...
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    Au sujet de unistd.h , Mr Delahaye écrit :
    De plus, faire un stat() sur un fichier ouvert est une drôle d'idée... Je dirais comportement indéfini, mais je n'ai pas le temps de lire la doc de stat en détail...
    C'est une remarque pertinente. Certaines opérations demandent que les fichiers soient ouverts, d'autres non.

    ( chsize, fchsize, truncate, ftruncate, stat, fstat, rename...etc).

    Pour un fichier ouvert avec fopen, c'est fstat de unistd.h, dont on peut se servir avec linux.

  14. #14
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    De plus, faire un stat() sur un fichier ouvert est une drôle d'idée... Je dirais comportement indéfini, mais je n'ai pas le temps de lire la doc de stat en détail...
    Non non, de ce côté là, pas de problème, heureusement d'ailleurs, comment vérifier sinon qu'un utilisateur n'a pas déjà ouvert un fichier avant nous? Au niveau de de la norme, aucun soucis!
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    unistd.h n'est peut-être pas standard, mais si je ne me trompe, c'est POSIX. Comme Linux respecte aussi la norme POSIX (du moins en grande partie), unistd.h sera toujours disponible sous linux...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    unistd.h n'est peut-être pas standard, mais si je ne me trompe, c'est POSIX. Comme Linux respecte aussi la norme POSIX (du moins en grande partie), unistd.h sera toujours disponible sous linux...
    Je confirme, unistd.h est standard POSIX, donc très portable :
    http://www.opengroup.org/onlinepubs/.../unistd.h.html
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Points : 28
    Points
    28
    Par défaut
    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
    #include<stdio.h>
    #include<stdlib.h>
    void stockage_dans_tableau(char *tableau,FILE * flux,unsigned taille)
    {
         int k;
         int c;
         int i=0;
         do{
             c=fgetc(flux);
         if(k=!feof(flux))
         {
         tableau[i]=c;
         i++;
         }
         }while(k);
         printf("\n");
         fclose(flux);
    }
    int nb_caractere(FILE * flux)
    {
        int k;
        int c=0; 
        unsigned o=0;
     
     
     
    do
    {
            c=fgetc(flux);
    if(k=!feof(flux))
        {
        o++;
        }
    }while(k);
    fclose(flux);
    return o;
    }
    int main(void)
    {
        int nb=0;
        char *tableau;
        FILE *flux;
        char nom[1024];
        int i=0;
        printf("Entrez le nom du fichier : ");
        scanf("%s",nom);
            flux=fopen(nom,"r");
    nb=nb_caractere(flux);
    printf("il y a %d caracteres.\n",nb);
     
    tableau=calloc(nb+1,sizeof(char));
    if(tableau!=NULL)printf("bien alloue.\n");
    else printf("pas allloue.\n");
     flux=fopen(nom,"r");
    stockage_dans_tableau(tableau,flux,nb);
     
    for(i=0;i<nb;i++)
    {
    printf("%c",tableau[i]);
    }
     
    printf("\n\n");
     
    free(tableau);
    //system("pause");
    return 0;
    }
    certaine phrase du code peuvent etre facilement changee

Discussions similaires

  1. Réponses: 51
    Dernier message: 06/01/2008, 16h47
  2. Stocker nom de fichier dans un tableau
    Par J0r_x dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 29/03/2007, 18h26
  3. charger un fichier dans un tableau
    Par nico0007 dans le forum Delphi
    Réponses: 3
    Dernier message: 16/01/2007, 23h59
  4. Mettre un fichier dans un tableau
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 26/07/2005, 10h47
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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