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 :

Saisie impossible avec fprintf


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Par défaut Saisie impossible avec fprintf
    Bonjour ,

    En fait quand j'exécute mon programme et ça arrive à la partie ou je dois saisir du texte dans un fichier le programme se ferme avant que je puisse entrer du texte à l'écran et je ne comprend pas pourquoi, voici mon code :

    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
     
     
    int main(int argc, char *argv[])
    {
        FILE* fichier = NULL;
        char nouveauFichier[TAILLE_NOUVEAU];
        char text[TAILLE_CONTENU] = "";
        //char* contenuFichier = NULL;
        int choixMenu = 0;
        char *argument[] = { "clear", NULL };
     
        // Allocation de la mémoire pour "text"
        //text = malloc(1000 * sizeof(char));
     
        //if (text == NULL)       exit(0);
        // Affichage du menu
        printf("\n1. Nouveau fichier \n");
        printf("2. Ouvrir \n");
        printf("3. Supprimer \n");
     
        do
        {
            printf("\n Votre choix :");
            scanf("%d", &choixMenu);
     
        } while (choixMenu < 1 || choixMenu > 3);
     
        switch (choixMenu)
        {
            // choix "Nouveau fichier"
            case 1 :
                // Entre le nom du fichier
                printf("\nNom du nouveau fichier : ");
                scanf("%s", nouveauFichier);
     
                // Création du fichier en mode écriture et virifie qu'il n'y a pas
                // d'erreur
                if ((fichier = fopen(nouveauFichier, "w+")) == NULL)
                {
                    fprintf(stderr, "Erreur lors de la création du fichier %s \n %s", nouveauFichier, strerror(errno));
                    exit(-1);
                }
     
                /*if (execv("/usr/bin/clear", argument) == -1)
                {
                    // Si execv est égale à -1 alors c'est une erreur :
                    perror("execv");
                    exit(-2);
                }*/
     
                printf("-- %s -- \n\n", nouveauFichier);
     
                //sleep(20);
                fprintf(fichier, "%s", text);
     
                fputs(text, fichier);
     
                fclose(fichier);
    Je n'ai pas mis les include volontairement! merci d'avance

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonsoir.
    Lorsque l'on entre une saisie au clavier, il faut la valider par un appui sur la touche « Entrée », ce qui écrit un caractère de nouvelle ligne dans le tampon de l'entrée standard.
    Lorsque l'on souhaite convertir une chaîne de caractères en nombre, les caractères d'espacement en début de chaîne sont ignorés, puis la lecture s'arrête au premier caractère qui n'est pas un chiffre (en simplifiant).

    Autrement dit, une fois que l'utilisateur a fait son choix (numérique) depuis le menu, le caractère de nouvelle ligne est encore présent dans le tampon de l'entrée standard.
    Lorsqu'ensuite tu cherches à lire le nom du nouveau fichier, le programme voit directement ce caractère, et donc arrête la lecture.
    C'est pour cette raison que quand on veut lire une ligne saisie au clavier, il faut d'abord « consommer » le caractère de nouvelle ligne si la dernière lecture de l'entrée standard l'a laissé dans le tampon.

    Et à propos de la lecture d'une saisie clavier...
    F.A.Q. C: Comment lire une ligne de manière securisée ?

  3. #3
    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
    @Steph_ng8
    Autrement dit, une fois que l'utilisateur a fait son choix (numérique) depuis le menu, le caractère de nouvelle ligne est encore présent dans le tampon de l'entrée standard.
    Oui
    Lorsqu'ensuite tu cherches à lire le nom du nouveau fichier, le programme voit directement ce caractère, et donc arrête la lecture
    Non : le format utilisé est %s et les caractères <Blancs> (caractères pour lesquels isspace() est vrai et dont fait partie le '\n') qui précèdent la chaine à lire sont sautés.

    Le défaut du programme lié à la présence de caractères restants dans le buffer d'entrée se manifestera dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        do
        {
            printf("\n Votre choix :");
            scanf("%d", &choixMenu);
        } while (choixMenu < 1 || choixMenu > 3);
    si l'utilisateur tape autre chose que des caractères <Blancs> (optionnels) suivis d'au moins un chiffre. Dans ce cas, on entrera dans une boucle infinie.

    Quant au problème du posteur, il faudrait qu'il précise ce qu'il veut faire parce que le titre de la discussion "Saisie impossible avec fprintf" me laisse pensif sur ses intentions : il est évident que printf() n'est pas fait pour opérer des saisies !

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par diogene Voir le message
    Non : le format utilisé est %s et les caractères <Blancs> (caractères pour lesquels isspace() est vrai et dont fait partie le '\n') qui précèdent la chaine à lire sont sautés.
    Ah oui, c'est vrai...
    Au temps pour moi...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 4
    Par défaut
    Désolé je me suis trompé c'est avec fscanf que je ne n'arrive pas à saisir dans un fichier

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Par défaut
    Citation Envoyé par D1ablO Voir le message
    Désolé je me suis trompé c'est avec fscanf que je ne n'arrive pas à saisir dans un fichier
    la fonction "fscanf()" est utiliser pour récupérer les données de fichier et non pour saisir des données au fichier

    si tu veux saisir de texte dans un fichier il faut remplir la variable "text[]" avant d'appeler la fonction "fprintf(fichier, "%s", text)" pour remplir de texte depuis le clavier utilise la fonction "scanf()" ou si tu veux récupérer de texte depuis un fichier existant utilise la fonction "fscanf()"

Discussions similaires

  1. [EJB] Remote call impossible avec WEBSPHERE
    Par nighma dans le forum Websphere
    Réponses: 1
    Dernier message: 19/06/2006, 16h18
  2. Réponses: 6
    Dernier message: 28/11/2005, 12h03
  3. Saisie impossible dans un TdbEdit
    Par deubal dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/11/2005, 12h32
  4. [D2005]Compilation impossible avec version Personnal
    Par fab56 dans le forum Delphi .NET
    Réponses: 4
    Dernier message: 16/08/2005, 19h10
  5. [Requête] Difficile (impossible ?) avec des dates
    Par starch dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/04/2004, 11h26

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