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 :

Petit probleme pour l ecriture dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut Petit probleme pour l ecriture dans un fichier
    Rebonjour à tous,
    Je vous expose mes code et vous explique le problème après^^

    Le main.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "anul_entrer.h"
    #include "main.h"
     
    #define NBR_JOUEUR 2
     
    int main()
    {
        int i = 0; //variable d'execution pour les boucles
        char *Recherche [TAILLE_MAX] = {""};
     
        S_InfoJoueur Info[NBR_JOUEUR+1]; //initialisation structure S_InfoJoueur
     
        FILE *DonneesJoueurs = NULL; //initialisation du pointeur sur le fichier
     
        DonneesJoueurs = fopen("DonneesJoueurs.save", "r+"); //ouverture du fichier en methode (lire et ecrire sans creation de fichier)
     
        if (DonneesJoueurs != NULL) { //verification de l ouverture du fichier
            printf("Ouverture fichier ... OK"); //ouverture fichier ok
     
             /*============================================================*/
             /*====================Ecriture des données====================*/
     
             for (i = 0; i < NBR_JOUEUR; i++) { //boucle qui permet l'insertion de données dans le fichier "DonneesJoueurs.txt" temps que le nbr de joueur n'est pas atteint
     
                printf("\n\n\t\t Joueur %d", i+1);//intro avec numero du joueur ("i+1" pour ne pas avoir de "Joueur 0")
     
                printf("\n\n Pseudo : ");//demande d'entrez l'info Pseudo correspondant a la struc S_InfoJoueur=> variable Pseudo.
                *Recherche = fgets(Info[i].Pseudo, TAILLE_MIN, stdin); //recuperation de l'info Pseudo
     
                fprintf(DonneesJoueurs, "%s", anul_entrer(*Recherche)); //ecrit les donnees receuilli dans le fichier text
             } //fin de la boucle for
        }
        else {
            printf("ECHEC ouverture fichier /!\\. Verifiez l'existance du dit fichier sur le disque !!!"); //echec ouverture fichier
        } // fin verif ouverture de fichier
     
        fclose(DonneesJoueurs); //fermeture du fichier
     
        return 0;
    }
    Le main.h
    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
     
    #ifndef MAIN
    #define MAIN
     
    #define TAILLE_MIN 100
    #define TAILLE_MAX 1000
     
    typedef struct InfoJoueur S_InfoJoueur;
     
    struct InfoJoueur
    {
        char Pseudo[TAILLE_MIN];
    };
     
    #endif
    le anul_entrer (source du problème je pense)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    char anul_entrer (char *Recherche)
    {
        char Chaine;
     
        *strchr(Recherche, '\n');
     
        if(Recherche != NULL) {
            Chaine = *strchr(Recherche, '\n') = '\0';
            return Chaine;
        }
        else {
            return *Recherche;
        }
    }
    bon le anul_entrer.h ne contient que le prototype donc je vous l'épargne^^.

    Le problème :

    Alors déjà, de temps en temps, la compilation m'indique : "main.c|33|warning: format argument is not a pointer (arg 3)|"
    Ce qui correspond à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fprintf(DonneesJoueurs, "%s", anul_entrer(*Recherche)); //écrit les données recueilli dans le fichier texte
    Sinon quand il me laisse exécuter le programme, et bien tout ce déroule comme il faut sauf que dans mon fichier texte "DonneesJoueur.save" tout ce que cela m'écrit c'est : (NULL)(NULL) au lieu des deux pseudo.

    En espérant avoir été clair ^^ need help :'(

    EDIT :

    J'ai tenté de modifier un peu mon "anul_entrer" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    char anul_entrer (char *Recherche)
    {
        char *Chaine;
     
        *Chaine = *strchr(Recherche, '\n');
     
        if(Chaine != NULL) {
            *Chaine = *strchr(Recherche, '\n') = '\0';
            return *Chaine;
        }
        else {
            return *Recherche;
        }
    }
    Mais la sa plante tout de suite après la saisi du premier pseudo ^^

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Commençons par anul_entrer() qui apparemment doit supprimer le '\n' dans une chaine si il est présent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char *Chaine; 
        *Chaine = ....
    va planter puique le pointeur Chaine n'est pas initialisé.

    Même si le pointeur Chaine était correctement initialisé, ceci risque de planter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... = *strchr(Recherche, '\n');
    strchr() retourne l'adresse du caractère cherché dans la chaine ou NULL si il n'est pas présent. Si la fonction renvoie NULL, le code plante puisque on déréférence le pointeur NULL, sinon le résultat est évidemment '\n'. Ce qui est interessant, ce n'est pas le caractère, mais son adresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * anul_entrer (char *Recherche)
    {
        char *Chaine = strchr(Recherche, '\n');
        if(Chaine != NULL)*Chaine = '\0';
        return Recherche;
    }
    qui peut être utilisé de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char Chaine[]="Une chaine\n";
    printf("%s",anul_entrer(Chaine));
    Pour main.c, à quoi sert le tableau de pointeurs Recherche ?

  3. #3
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Et bien en fait pour "Recherche", je pensais qu'il me faudrait forcement un tableau pour enregistrer la chaine (pas clair sa ^^) je veu dire, comme j'avais une chaine, j'ai trouvé utile de faire un tableau pour la stock mais en fait ce ,n'est peu être pas nécessaire :s ?.

    Cela dit je vais tenter de mettre en application votre code et merci des explication .

  4. #4
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 15
    Par défaut
    Hummm décidément je n'y arrive pas :s
    votre code pour anul_entrer fonctionne mais sa me renvoi tjr : `Ä

    Complètement pommé je suis ^^ mais je continu pas les chapitre temps que ce truc ne marchera pas

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Par défaut
    Quel est ton problème exactement ?

    Parce que chez moi le code fonctionne parfaitement !!

    Bon j'ai juste modifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DonneesJoueurs = fopen("DonneesJoueurs.save", "r+");
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DonneesJoueurs = fopen("DonneesJoueurs.save", "w+");
    Comme ca, si le fichier n'existe pas, il sera crée par le programme. Mais c'est pas ca qui va changer ton problème

    Et aussi (seulement pour la forme)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(DonneesJoueurs, "%s  ", anul_entrer(*Recherche));
    Note: un espace blanc après "%s", pour bien séparer les noms dans le fichier que tu vas écrire...

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par NatanielKrios Voir le message
    Hummm décidément je n'y arrive pas :s
    votre code pour anul_entrer fonctionne mais sa me renvoi tjr : `Ä

    Complètement pommé je suis ^^ mais je continu pas les chapitre temps que ce truc ne marchera pas
    je crois, à voir le code tel que tu l'as écrit, que ton problème est dans la conception et l'utilisation des pointeurs et adresses.

    Pour main(), on peut envisager quelque chose du genre :
    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
    int main(void)
    {
        int i; // compte les entrées
        S_InfoJoueur Info[NBR_JOUEUR];
        char* Entree; // indique si les entrées sont terminées
        FILE *DonneesJoueurs = fopen("DonneesJoueurs.save", "w+");
        if (DonneesJoueurs != NULL)
        {
            // Lecture et écriture des données tant que Entree != NULL
            // Alors Entree==NULL si
            //- l'utilisateur entre un EOF (une fin d'entrée des données)
            //- ou le nombre d'entrées effectuées est égal au nombre de joueurs
            i=0 ;
            do
            {
                printf("\n\n\t\t Joueur %d\n\n Pseudo : ", i+1);
                Entree = fgets(Info[i].Pseudo, TAILLE_MIN, stdin);
                // Si l'utilisateur a tapé EOF, Entree == NULL
                if(Entree!= NULL)// Alors Entree == Info[i].Pseudo
                {
                  fprintf(DonneesJoueurs, "%s", anul_entrer(Entree));
                  i++;
                  if(i == NBR_JOUEUR) Entree = NULL; // Fin des entrées
                }
            }while(Entree != NULL);
            fclose(DonneesJoueurs);
        }
        else printf("ECHEC ouverture fichier");
        return 0;
    }

Discussions similaires

  1. Problème d'écriture dans un fichier
    Par Ceris dans le forum Assembleur
    Réponses: 2
    Dernier message: 22/05/2006, 23h30
  2. Problème d'écriture dans un fichier de log
    Par yakotey dans le forum Administration système
    Réponses: 14
    Dernier message: 22/11/2005, 15h08
  3. [C#] Probleme d'écriture dans un fichier XML
    Par Joad dans le forum ASP.NET
    Réponses: 5
    Dernier message: 02/05/2005, 16h19
  4. probleme d'ecriture dans un fichier texte
    Par azrael88370 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/01/2005, 17h33
  5. Probleme d'ecriture dans un fichier en mode Text
    Par bbozet dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/01/2004, 13h46

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