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 :

Soucis pour ouvrir et ecrire dans un fichier


Sujet :

C

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Soucis pour ouvrir et ecrire dans un fichier
    Bonjour à tous (je commence bien pour mon premier post ^^)!

    Mon problème est que je ne comprend pas trop comment fonctionne les fonctions utilisées pour ouvrir (fopen) ou écrire (fgets) dans un fichier.
    Par exemple pour moi "fopen" va m'ouvrir mon fichier dans une fenêtre et avec le bon programme comme un grand
    (je sais c'est de l'utopie).

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define TAILLE 100
     
    //Prototypes
     
    FILE* fopen(const char* MonFichier, const char* LeMode);
     
     
    int main ()
    {
        FILE* Fichier = NULL;
        char Texte[TAILLE];
     
        Fichier = fopen("test.txt", "r+");
     
         if (Fichier != NULL)
        {
            // On demande le texte 
            printf("Votre message [100 caracteres max]\n\t");
            fgets(Texte, TAILLE, Fichier); 
        }
        else 
        { printf("Le fichier n'existe pas!");
         }
     
        system("PAUSE");
     
     return 0;   
    }
     
     
    //Fonctions
     
     
    FILE* fopen(const char* MonFichier, const char* LeMode)
    { FILE* FILE;
      return (FILE);     
          }
    J'ai mis les prototypes et les fonctions dans le fichier main par soucis de lisibilité et de compréhension
    Je précise également que le fichier que je tente d'ouvrir n'est pas vide (il contient une phrase) et qu'il se trouve dans le même dossier que mon fichier '.c'

    Je pense que mon problème vient de fgets ==> c'est lui le fautif, je comprends rien de ce qu'il fait

    PS : je ne pensais pas qu'en commençant à apprendre le C que je buterais sur une simple ouverture de fichier ^^ (étant un utilisateur lambda qui fait un simple double-clic pour ouvrir son fichier )

    PS2 : Je précise que j'essaye de le faire fonctionner sous linux également ==> tout est identique sauf le system("PAUSE") en moins voilà

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    et bienvenue dans nos forums !


    Si tu débute tout juste dans le C, tu ne commences surement pas au début car les fichiers viennent bien plus tard dans l'apprentissage mais passons... Déjà pour commencer, tu ne peux pas nommer une fonction perso fopen car elle existe déjà dans la bibliothèque standard du C (ton compilateur aurait dû te le dire mais il n'est pas bien réglé au niveau des options de compilation), d'autant plus qu'elle ne te sert à rien là, je ne vois pas ce que tu as ssayé de faire .

    Ensuite, pour écrire dans le fichier ce n'est pas fgets qui lit une ligne dans un fichier mais fputs ou encore fprintf !

    Par exemple pour moi "fopen" va m'ouvrir mon fichier dans une fenêtre et avec le bon programme comme un grand
    Tu as de l'espoir En fait non, il n'existe pas de notion de fenêtre en C standard donc fopen ne va pas t'ouvrir une fenêtre et encore moins te lancer le programme adéquat et ouvrir le fichier dedans, fopen ouvre simplement le fichier ou tout du moins un flux de données rien de plus qui soit dit en passant, doit être refermé par toi même avec fclose lorsque tu n'en aura plus besoin !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok, alors je vais préciser certaines choses!
    1) Je suis un débutant légèrement aguerrie en langage C ^^
    2) Je sais que fopen ne faisait pas tout ça, c'était de l'humour (peut être mal employé).

    Ensuite merci beaucoup Franck.H parce que je n'étais pas sûr que fopen était une fonction déjà présente dans une bibliothèque (stdlib.h ou stdio.h je présume).
    Pour le fclose c'est un oubli lamentable de ma part.

    Enfin, j'ai mal exprimé ce que je voulais faire : je souhaite ouvrir un fichier, écrire dedans, sauvegarder le texte entré puis fermer le fichier.
    J'ai compris dans l'ensemble l'emploi des différents modes avec fopen mais ça s'arrête là.
    Les outils (ici fonctions) que j'ai à m'a disposition sont bien fopen, fclose, fputs ou fprintf ???

    PS: Comment peut on se servir d'un "fgets" correctement ? Parce que pour moi son utilité, c'est qu'il est plus sécurisé que le scanf mais je ne vois pas autre chose.
    [Réponse précise et rapide ==> ce site a du bon ^^]

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Oui fgets est beaucoup plus sûr, il demande quelques manipulations supplémentaires, surtout si tu veux à tout prix récupérer une valeur numérique, il faudra dans ce cas convertir la chaîne retournée par fgets mais limite toi pour le moment aux chaînes.

    Voici comment récupérer une saisie utilisateur comme tu souhaite le faire: http://c.developpez.com/faq/?page=cl...ran#CONS_fgets

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Je voudrais juste une petite précision et après je pourrais mettre fièrement [Résolu] à mon post.

    La solution que j'ai trouvée avec le fgets pour prendre le texte rentré par l'utilisateur me paraît bizarre et source de problème ^^.
    Une explication svp ?

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    //Definition de la taille max possible pour une phrase
    #define TAILLE 100
     
     
    int main ()
    {
        FILE* Fichier = NULL;
        char Texte[TAILLE];
     
        Fichier = fopen("test.txt", "r+");
     
         if (Fichier != NULL)
        {
     
            //Affichage du texte déjà présent dans le fichier
            while (fgets(Texte, TAILLE, Fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
                printf("%s", Texte); // On affiche la chaîne qu'on vient de lire
            }
     
            // On demande le texte à l'utilisateur
            printf("Entrez votre message [%d caracteres max] : \n", TAILLE);
            *(Texte+TAILLE)= fgets(Texte, TAILLE, stdin); // Texte de l'utilisateur
     
            //On met dans le fichier le texte rentré par l'utilisateur
            fputs(Texte, Fichier);
     
            //On ferme le fichier
            fclose(Fichier);     
        }
        else 
        { printf("Le fichier n'existe pas!\n");
         }
     
         system("PAUSE");
     
     return 0;   
    }

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Tu te complique la vie en fait, ce qui est en rouge n'est pas forcément nécessaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *(Texte+TAILLE) = fgets(Texte, TAILLE, stdin);
    Par contre tu peux te servir du retour de fgets pour savoir si tu as lu quelque chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ((fgets (Texte, TAILLE, stdin)) != NULL)
    {
      /* Ecriture... */
    }
    Regarde l'exemple que je t'ai montré dans le lien FAQ

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Un exemple vaut mieux qu'un long discours:

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    #define SIZE 100
     
     
    int main (void)
    {
       FILE * file = NULL;
       char buff [SIZE];
     
     
       printf ("Entrez un texte : ");
     
       if ((fgets (buff, SIZE, stdin)) != NULL)
       {
          /*
             fgets lit le saut de ligne s'il est present dans la ligne et s'il
             reste assez de place dans le buffer
          */
          char * c = strchr (buff, '\n');
     
          if (c != NULL)
          {
             *c = 0;
          }
     
     
          /* Ecriture dans un fichier. */
          file = fopen ("data.txt", "w");
     
          if (file != NULL)
          {
             fputs (buff, file);
             fclose (file);
          }
       }
     
     
       return EXIT_SUCCESS;
    }
    Améliorable pour ajouter de la sécurité dans le traitement des buffer mais c'est la base !

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup.
    C'est beaucoup plus clair que dans l'exemple qui m'avais laissé sur ma faim.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir et ecrire dans un fichier txt
    Par lolo81 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 28/01/2011, 02h39
  2. Réponses: 4
    Dernier message: 09/12/2010, 15h30
  3. Probléme pour ecrire dans un fichier
    Par julien1981 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/06/2006, 11h18
  4. [VBA-E]Ecrire dans un fichier sans l'ouvrir (ou dans un fichier invisible)
    Par bandit boy dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/05/2006, 17h14
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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