Fichier en C :(
Résolu/Fermé
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
-
3 avril 2008 à 20:53
didy_gwatinik Messages postés 352 Date d'inscription samedi 17 novembre 2007 Statut Membre Dernière intervention 30 mars 2010 - 8 avril 2008 à 23:56
didy_gwatinik Messages postés 352 Date d'inscription samedi 17 novembre 2007 Statut Membre Dernière intervention 30 mars 2010 - 8 avril 2008 à 23:56
A voir également:
- Fichier en C :(
- Fichier rar - Guide
- Fichier host - Guide
- Fichier iso - Guide
- Téléchargez cette archive (dossier compressé). en extraire tous les fichiers dans un dossier local. quel fichier contient l’expression trouverpix ? ✓ - Forum Windows
- Ouvrir fichier .bin - Guide
12 réponses
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
3 avril 2008 à 21:11
3 avril 2008 à 21:11
Bonjour,
J'essaie de voir ça, (En tout le programme est propre) mais il plante au premier lancer sans créer de fichier.
C'est dans la fonction fichierVariable, il veut ouvrir un fichier qui n'existe pas, cela échoue, le problème est qu'il ferme le fichier qui n'est pas ouvert. Blaf!
Je déplace la ligne et je continue...
M.
J'essaie de voir ça, (En tout le programme est propre) mais il plante au premier lancer sans créer de fichier.
C'est dans la fonction fichierVariable, il veut ouvrir un fichier qui n'existe pas, cela échoue, le problème est qu'il ferme le fichier qui n'est pas ouvert. Blaf!
Je déplace la ligne et je continue...
M.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
3 avril 2008 à 21:12
3 avril 2008 à 21:12
Merci beaucoup!
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
3 avril 2008 à 21:23
3 avril 2008 à 21:23
Au bas du switch:
if( &nbContact > 0 )
:-/
J'ai réussi à rentrer un email ! Je voulais un .com ^^
aze@truc.f@rez.fr est valide. (je pense)
Ca vient, j'ai créé un fichier.
M.
if( &nbContact > 0 )
:-/
J'ai réussi à rentrer un email ! Je voulais un .com ^^
aze@truc.f@rez.fr est valide. (je pense)
Ca vient, j'ai créé un fichier.
M.
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
3 avril 2008 à 21:50
3 avril 2008 à 21:50
Dans fichierVariable:
Pourquoi ne faut-il pas utiliser fflush(stdin) pour vider le buffer clavier ?.
D'autre part, que vient faire l'entrée standard dans la lecture d'un fichier ?
L'erreur à proprement dite:
Ouverture du fichier.
Lecture du nombre de contacts. (J'aurais mis un 's' à nbContact ^^)
Lecture fort peu élégante d'un contact. (1 seul contact dans le fichier)
Le fichier n'est pas vide, nouveau tour de boucle.
Ecrasement du nombre de contacts avec 0.
Passage de la boucle for car i = 0 n'est pas < nbContact = 0.
Le fichier est vide.
fermeture du fichier.
fin de la fonction.
Le contact est chargé correctement malgré les \n qui ont été lu au bout de chaque champ. nbContact vaut zéro.
Remarques autres:
- Idem pour le fclose de l'autre fonction.
- Je conseillerais l'utilisation d'un fichier binaire.
- Le code est propre et lisible. Ca fait plaisir.
M.
Pourquoi ne faut-il pas utiliser fflush(stdin) pour vider le buffer clavier ?.
D'autre part, que vient faire l'entrée standard dans la lecture d'un fichier ?
L'erreur à proprement dite:
Ouverture du fichier.
Lecture du nombre de contacts. (J'aurais mis un 's' à nbContact ^^)
Lecture fort peu élégante d'un contact. (1 seul contact dans le fichier)
Le fichier n'est pas vide, nouveau tour de boucle.
Ecrasement du nombre de contacts avec 0.
Passage de la boucle for car i = 0 n'est pas < nbContact = 0.
Le fichier est vide.
fermeture du fichier.
fin de la fonction.
Le contact est chargé correctement malgré les \n qui ont été lu au bout de chaque champ. nbContact vaut zéro.
Remarques autres:
- Idem pour le fclose de l'autre fonction.
- Je conseillerais l'utilisation d'un fichier binaire.
- Le code est propre et lisible. Ca fait plaisir.
M.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
3 avril 2008 à 21:55
3 avril 2008 à 21:55
Je n'ai pas très bien compris en ce qui concerne la lecture du contact. C'est moche? Il faut que je change des variables?
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
3 avril 2008 à 22:00
3 avril 2008 à 22:00
Faut-il que je crée une fonction pour écraser la mémoire tampon
exemple
void videTampon()
{
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
exemple
void videTampon()
{
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
>
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
3 avril 2008 à 22:13
3 avril 2008 à 22:13
On peut, une fonction inline si possible voire une macro...
Encore avant les scanf l'erreur est tellement commune et les compilateur les plus utilisés supportent ce comportement. Cela pourrait passer. Par contre vider le buffer du clavier en pleine lecture dans un fichier ça choque un tantinet. ^^
M.
Encore avant les scanf l'erreur est tellement commune et les compilateur les plus utilisés supportent ce comportement. Cela pourrait passer. Par contre vider le buffer du clavier en pleine lecture dans un fichier ça choque un tantinet. ^^
M.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
3 avril 2008 à 22:08
3 avril 2008 à 22:08
J'aurais fait plus court...
En fait j'aurais fait en utilisant un fichier binaire mais je l'ai déjà dit au dessus et ce n'est pas à moi qu'appartient la décision.
M.
for(i=0;i<*nbContact;i++)//4 car il y a 5 champs ds la structure
{
fgets(tab[i].nom, sizeof( tab[i].nom ), fichier );
fgets(tab[i].prenom, sizeof( tab[i].prenom ), fichier );
fgets(tab[i].numTel, sizeof( tab[i].numTel ), fichier );
fgets(tab[i].mel, sizeof( tab[i].mel ), fichier );
fgets(tab[i].motdepasse, sizeof( tab[i].motdepasse ), fichier );
}
En fait j'aurais fait en utilisant un fichier binaire mais je l'ai déjà dit au dessus et ce n'est pas à moi qu'appartient la décision.
M.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
3 avril 2008 à 22:56
3 avril 2008 à 22:56
Comment utilise-t-on le binaire?
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
3 avril 2008 à 23:50
3 avril 2008 à 23:50
Petite modification, je déclare le type puis la variable.
typedef struct contact_t
{
char nom[20];
char prenom[20];
char numTel[11];
char mel[50];
char motdepasse[9];
} contact_t;
contact_t tab[N];
Pour le fichier:
fopen( "leFichier.truc", "wb" ); et fopen( "leFichier.truc", "rb" );
fwrite( tab + i, sizeof( contact_t ), 1, fichier );
fread( tab + i, sizeof( contact_t, 1, fichier );
Inconvénient: le fichier est plus gros car les 110 octets maximums de la structure sont toujours écrits; Le fichier ne peut pas être éditer dans un blocnote ou autre.
Avantage: plus simple, plus sûr, plus opaque (il faut un éditeur héxa), on peut envisager de ne lire que le contact 7 sans parcourir tout le fichier.
Comme les contacts sont dans un tableau on peut aussi faire sauter la boucle for:
La fonction de lecture a à peu près la même tête avec un "rb" et des fread.
On peut vérifier le nombre d'objets lus avec succès grace à la valeur de retour pour éventuellement corriger le nbContacts en cas de problème du fichier.
M.
typedef struct contact_t
{
char nom[20];
char prenom[20];
char numTel[11];
char mel[50];
char motdepasse[9];
} contact_t;
contact_t tab[N];
Pour le fichier:
fopen( "leFichier.truc", "wb" ); et fopen( "leFichier.truc", "rb" );
fwrite( tab + i, sizeof( contact_t ), 1, fichier );
fread( tab + i, sizeof( contact_t, 1, fichier );
Inconvénient: le fichier est plus gros car les 110 octets maximums de la structure sont toujours écrits; Le fichier ne peut pas être éditer dans un blocnote ou autre.
Avantage: plus simple, plus sûr, plus opaque (il faut un éditeur héxa), on peut envisager de ne lire que le contact 7 sans parcourir tout le fichier.
Comme les contacts sont dans un tableau on peut aussi faire sauter la boucle for:
void enregistrement(int *nbContact)
{
FILE *fichier = fopen(chemin,"wb");
if ( fichier != NULL )
{
fwrite( nbContact, sizeof( *nbContact ), 1, fichier );
fwrite( tab, sizeof( contact_t ), *nbContact, fichier );
fclose(fichier);
}
}
La fonction de lecture a à peu près la même tête avec un "rb" et des fread.
On peut vérifier le nombre d'objets lus avec succès grace à la valeur de retour pour éventuellement corriger le nbContacts en cas de problème du fichier.
M.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
4 avril 2008 à 00:01
4 avril 2008 à 00:01
Je vais faire ca au calme demain et je te dis ca!
Merci pour toute cette aide vraiment!
Bonne soirée
Merci pour toute cette aide vraiment!
Bonne soirée
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
8 avril 2008 à 18:56
8 avril 2008 à 18:56
Fait donc, en plus je suis de mauvais poil aujourd'hui, je ne vais rien laisser passer. Attention si il manque des point-virgules, je mords.
M.
M.
J'ai pas trop envie de me faire croquer lol
Juste une petite kestion dans le message précédent tu as mis : fwrite( nbContact, sizeof( *nbContact ), 1, fichier );
A quoi correspond le 1? Tu peux m'expliquer comment s'utilise fwrite et fread s'il te plait parce que je ne sais pas si ca ira avec ce que je faisais au début c'est à dire mettre le contenu du fichier dans les variables dans la fonction fichierVariable
Juste une petite kestion dans le message précédent tu as mis : fwrite( nbContact, sizeof( *nbContact ), 1, fichier );
A quoi correspond le 1? Tu peux m'expliquer comment s'utilise fwrite et fread s'il te plait parce que je ne sais pas si ca ira avec ce que je faisais au début c'est à dire mettre le contenu du fichier dans les variables dans la fonction fichierVariable
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
8 avril 2008 à 20:10
8 avril 2008 à 20:10
Ah bah je vois que mes liens sur fread/fwrite ont servis. ^^ Héhé.
Le premier paramètre est le buffer de données, le deuxième la taille d'une donnée, le troisième le nombre d'objets de la taille précédemment spécifiée et le quatrième le fichier. La valeur de retour est le nombre d'objets écrits avec succès.
Il y a des cas où l'on n'a pas de buffer avec toutes les données les unes à la suite des autres et donc prêtes à écrire toutes d'un coup. Dans ce cas on fera un for pour les écrire une par une. (d'où le 1) Si par chance elles sont consécutives dans la mémoire on fera l'écriture en une fois comme dans l'exemple du précédent post.
En mode binaire les données dans le fichier sont une copie exacte des données dans la mémoire:
- Les tableaux de 20 caractères seront écrits sur 20 octets même si c'est pour coder "Bonjour".
- Les entiers seront codés sur 4 octets. (généralement, en fait c'est le développeur qui précise)
A l'inverse en mode texte, "Bonjour" est codé sur 8 octets et 123456789 sera écrit sur 9 octets.
M.
EDIT. :
Whoups, en plus je lis mal la question.
La ligne que tu as reprise dans ton poste écrit le nombre de contacts au début du fichier. A savoir comme paramètres : l'adresse de ta variable, sa taille en octets et 1 car il n'y a qu'un seul nombre à écrire.
Le premier paramètre est le buffer de données, le deuxième la taille d'une donnée, le troisième le nombre d'objets de la taille précédemment spécifiée et le quatrième le fichier. La valeur de retour est le nombre d'objets écrits avec succès.
Il y a des cas où l'on n'a pas de buffer avec toutes les données les unes à la suite des autres et donc prêtes à écrire toutes d'un coup. Dans ce cas on fera un for pour les écrire une par une. (d'où le 1) Si par chance elles sont consécutives dans la mémoire on fera l'écriture en une fois comme dans l'exemple du précédent post.
En mode binaire les données dans le fichier sont une copie exacte des données dans la mémoire:
- Les tableaux de 20 caractères seront écrits sur 20 octets même si c'est pour coder "Bonjour".
- Les entiers seront codés sur 4 octets. (généralement, en fait c'est le développeur qui précise)
A l'inverse en mode texte, "Bonjour" est codé sur 8 octets et 123456789 sera écrit sur 9 octets.
M.
EDIT. :
Whoups, en plus je lis mal la question.
La ligne que tu as reprise dans ton poste écrit le nombre de contacts au début du fichier. A savoir comme paramètres : l'adresse de ta variable, sa taille en octets et 1 car il n'y a qu'un seul nombre à écrire.
Donc si j'ai bien compri
Comment faire pour ouvrir un fichier en écriture c'est "wb" c'est bien ça? Est-ce que ça efface les données précédentes? Je reste un peu perdue, donc en gros l'utilisation du binaire va t-il changer complétement mon programme, seuls les fonctions enregistrement et fichierVariable sont modifiées n'est ce pas ou il faut recommencer c'est à dire saisir les informations directement dans le fichier et les lire dans le fichier.
fwrite( tab, sizeof( contact_t ), *nbContact, fichier );copie tout le tableau dans le fichier?
Comment faire pour ouvrir un fichier en écriture c'est "wb" c'est bien ça? Est-ce que ça efface les données précédentes? Je reste un peu perdue, donc en gros l'utilisation du binaire va t-il changer complétement mon programme, seuls les fonctions enregistrement et fichierVariable sont modifiées n'est ce pas ou il faut recommencer c'est à dire saisir les informations directement dans le fichier et les lire dans le fichier.
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
8 avril 2008 à 22:22
8 avril 2008 à 22:22
C'est bien ça.
Plus précisément on recopie octet par octet les *nbContact contacts du tableau dans le fichier.
L'ouverture en écriture est bien "wb". Tu peux te référer à la MSDN sur fopen.
L'option w crée ou ouvre un fichier en détruisant son contenu.
Pour concaténer à la fin d'un fichier tu peux utiliser "a" (et même "ab" ici) Ceci dit je trouve mieux dans ton cas de ré-écrire le fichier complet à chaque fois.
Le mode binaire change:
- Le mode d'ouverture (donc le b dans "wb" et "rb") Le mode Texte est celui par défaut, pour dire "Texte" explicitement c'est "wt" et "rt". (Oui, ça ne sert à rien)
- Les fonctions d'écriture et de lecture.
fprintf, fputs, fputc, fscanf, fgets, fgetc en mode texte.
fread, fwrite en mode binaire.
Il y a une précaution supplémentaire à avoir avec le mode binaire :
En mode texte on aurait un fichier avec deux caractères, 2 et 2. (soit 50 et 50 en ASCII ou en binaire)
En mode binaire on aurait une suite d'octets: (j'écris en héxadécimal c'est plus simple)
16 00 00 00 sur une machine où le long int est sur 4 octets (Windows 32 bits par exemple)
16 00 00 00 00 00 00 00 sur un Windows 64 bits.
(le mode texte vu en héxa serait 32 32.)
C'est la seule chose dont il faut se méfier par rapport au mode texte. Il faut juste s'assurer que l'on prends des types équivalents dans les versions 32 et 64 bits. On définira souvent un type typedef long int i32; afin de bénéficier d'un type dont la taille est connue. Pour compiler en 64 bits on changera juste la définition du type.
D'après mes souvenirs le mode texte ou binaire ne change que deux de tes fonctions.
Bien mangé ?
(Moi j'y vais)
M.
PS: Alors ? On a perdu son mot passe ? :P
Plus précisément on recopie octet par octet les *nbContact contacts du tableau dans le fichier.
L'ouverture en écriture est bien "wb". Tu peux te référer à la MSDN sur fopen.
L'option w crée ou ouvre un fichier en détruisant son contenu.
Pour concaténer à la fin d'un fichier tu peux utiliser "a" (et même "ab" ici) Ceci dit je trouve mieux dans ton cas de ré-écrire le fichier complet à chaque fois.
Le mode binaire change:
- Le mode d'ouverture (donc le b dans "wb" et "rb") Le mode Texte est celui par défaut, pour dire "Texte" explicitement c'est "wt" et "rt". (Oui, ça ne sert à rien)
- Les fonctions d'écriture et de lecture.
fprintf, fputs, fputc, fscanf, fgets, fgetc en mode texte.
fread, fwrite en mode binaire.
Il y a une précaution supplémentaire à avoir avec le mode binaire :
long int i = 22; // Perdu ! je ne suis pas né un 22 ;-) fwrite( &i, sizeof( long int ), 1, monFichier );
En mode texte on aurait un fichier avec deux caractères, 2 et 2. (soit 50 et 50 en ASCII ou en binaire)
En mode binaire on aurait une suite d'octets: (j'écris en héxadécimal c'est plus simple)
16 00 00 00 sur une machine où le long int est sur 4 octets (Windows 32 bits par exemple)
16 00 00 00 00 00 00 00 sur un Windows 64 bits.
(le mode texte vu en héxa serait 32 32.)
C'est la seule chose dont il faut se méfier par rapport au mode texte. Il faut juste s'assurer que l'on prends des types équivalents dans les versions 32 et 64 bits. On définira souvent un type typedef long int i32; afin de bénéficier d'un type dont la taille est connue. Pour compiler en 64 bits on changera juste la définition du type.
D'après mes souvenirs le mode texte ou binaire ne change que deux de tes fonctions.
Bien mangé ?
(Moi j'y vais)
M.
PS: Alors ? On a perdu son mot passe ? :P
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
8 avril 2008 à 22:47
8 avril 2008 à 22:47
Ok ok, j'ai compri donc un petit exemple, si je veux écrire le nombre de contact dans la variable *nbContact, je dois la lire dans le fichier puis l'écrire , ca donne ça : fread(*nbContact, sizeof(*nbContact),1,fichier)? Ceci me parait bien bizar!!!! j'ai du me tromper à sizeof(*nbContact).
J'ai retrouvé mon mot de passe :).
Le repas était des plus délicieux lol.
Bon appétit
J'ai retrouvé mon mot de passe :).
Le repas était des plus délicieux lol.
Bon appétit
Mahmah
Messages postés
496
Date d'inscription
lundi 17 septembre 2007
Statut
Membre
Dernière intervention
22 juin 2010
125
8 avril 2008 à 23:53
8 avril 2008 à 23:53
C'est presque ça.
C'est juste le premier paramètre, il lui faut une adresse vers une zone mémoire dans laquelle il peut écrire. (Tout comme scanf) Il y a donc juste une * en trop.
Le sizeof est bon. On pourrait mettre sizeof( int ) puisque c'est la taille en nombre d'octets d'un élément du buffer mais je préfère mettre par rapport à la variable, cela évite d'oublier de le changer si on modifie le type de la variable.
Pour la lecture, seul le nom de la fonction a changé. (et le w/r du fopen évidement)
On peut mieux faire: (Et là moi J'♥ ! D'ailleurs on peut le mettre aussi pour l'écriture)
Le nombre d'éléments est la taille du tableau en octets divisé par la taille d'un élément.
Et voilà,
Ca fera 350€ ^^
Si il y a toujours un truc qui te chagrine... je repasserai demain soir.
(C'est plus fort que moi, j'aime pas les chagrinées. >_<)
Bonne soirée à toi,
M.
C'est juste le premier paramètre, il lui faut une adresse vers une zone mémoire dans laquelle il peut écrire. (Tout comme scanf) Il y a donc juste une * en trop.
Le sizeof est bon. On pourrait mettre sizeof( int ) puisque c'est la taille en nombre d'octets d'un élément du buffer mais je préfère mettre par rapport à la variable, cela évite d'oublier de le changer si on modifie le type de la variable.
#include <stdio.h>
#include <string.h>
int main ()
{
FILE *pFile = NULL;
char *szFile = "test.truc";
// Des variables à écrire.
unsigned int uMyValue = 22;
char cMyChar = 'A';
int aiMyIntArray[] = { 1, 9, 2, 8 };
//////////////
// Ecriture //
//////////////
pFile = fopen( szFile, "wb" );
if ( pFile != NULL )
{
// Le int.
fwrite( &uMyValue, sizeof( uMyValue ), 1, pFile );
// Le char.
fwrite( &cMyChar, sizeof( cMyChar ), 1, pFile );
// Le tableau de int.
fwrite( aiMyIntArray, sizeof( *aiMyIntArray ), 4, pFile );
// Ou (moins beau à mon goût)
// fwrite( aiMyIntArray, sizeof( aiMyIntArray ), 1, pFile );
fclose( pFile );
}
// On écrase les variables.
uMyValue = 0;
cMyChar = 0;
memset( aiMyIntArray, 0, sizeof( aiMyIntArray ) );
/////////////
// Lecture //
/////////////
pFile = fopen( szFile, "rb" );
if ( pFile != NULL )
{
// Le int.
fread( &uMyValue, sizeof( uMyValue ), 1, pFile );
// Le char.
fread( &cMyChar, sizeof( cMyChar ), 1, pFile );
// Le tableau de char.
fread( aiMyIntArray, sizeof( *aiMyIntArray ), 4, pFile );
// Ou
// fread( aiMyIntArray, sizeof( aiMyIntArray ), 1, pFile );
fclose( pFile );
}
printf( "Les valeurs sont :\n%d\n%c\n{ %d, %d, %d, %d }\n", uMyValue, cMyChar, aiMyIntArray[0], aiMyIntArray[1], aiMyIntArray[2], aiMyIntArray[3] );
getchar();
return 0;
}
Pour la lecture, seul le nom de la fonction a changé. (et le w/r du fopen évidement)
On peut mieux faire: (Et là moi J'♥ ! D'ailleurs on peut le mettre aussi pour l'écriture)
fread( aiMyIntArray, sizeof( *aiMyIntArray ), sizeof( aiMyIntArray ) / sizeof( *aiMyIntArray ), pFile );
Le nombre d'éléments est la taille du tableau en octets divisé par la taille d'un élément.
Et voilà,
Ca fera 350€ ^^
Si il y a toujours un truc qui te chagrine... je repasserai demain soir.
(C'est plus fort que moi, j'aime pas les chagrinées. >_<)
Bonne soirée à toi,
M.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
8 avril 2008 à 23:56
8 avril 2008 à 23:56
ok ok ben je poste un message demain poue te dire ou j'en suis merci pour tout
bonne soirée
bonne soirée