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 :

ecrire dans un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 51
    Par défaut ecrire dans un fichier
    je voudrais que quand j'ouvre le programme il me demande mon nom et qu'il ensuite l'ecrit dans le fichier et ensuite le lise ==> 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
    #include <cstdio> // Pour les fonctions sur les fichiers et printf()
    #include <cstdlib> // Pour system()
    #include <cstring> // Pour les fonctions sur les chaînes
    #include <iostream>
    using namespace std;
     char nom[256];
     
    /* Fonction écrire(), qui écrit dans un fichier non-créé */
    void ecrire()
    {
         cout<<"ENTRER VOTRE NOM"<<endl;
         cin >>  nom;
         FILE *fichier_config; // On déclare le pointeur
         fichier_config = fopen("chat.txt", "a"); // On ouvre (crée plutôt :o) le fichier (w)
         fprintf(fichier_config, nom); // On écrit dedans ;o)
         fclose(fichier_config); // Puis on ferme
         return ; // On met l'instruction return toute seule car la fonction est de type "void" (=vide ;o)
     
    }
     
    /* Fonction principale qui lit le fichier, et écrit dans la console */
    int main(int argc, char *argv[])
    {
         ecrire(); // On écrit dans le fichier avec la fonction ecrire() définie plus haut :o)
     
         FILE *fichier;
         fichier = fopen("chat.txt", "w");
         char *texte_fichier; // On déclare une chaîne
         texte_fichier = new char[50]; // On alloue 50 caractères pour cette chaîne
     
         // Fonction fread() qui lit le fichier puis enregistre dans la chaîne "texte_fichier"
         fread(texte_fichier, sizeof(char), strlen(nom), fichier);
         printf("%s", texte_fichier);
         delete[] texte_fichier; // On libère l'espace mémoire pris par texte_fichier
         fclose(fichier); // /!\ On ferme le fichier /!\
         system("PAUSE");
         getchar();
         return 0; // Puis on quitte !!
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Par défaut
    Ton problème doit être au niveau de l'allocation de mémoire par new / delete. Parsème ton programme de marques du genre cout << "écriture" ou cout << "allocation de mémoire" pour voir précisément où apparaît l'erreur.

    De plus, pourquoi mêles-tu les bibliothèques standards C et C++ ? Tu peux tout faire avec les strings et les fstreams C++, ce qui sera nettement plus clean puisque ces classes ont l'avantage d'allouer et de désallouer leur mémoire elles-mêmes. C'est plus sécurisé que tes bricolages (surtout écrire 256 caractères et en lire seulement 50 !).

    Pour les strings, on fait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string s = "Hello";
    cout << s;
    s += ", world"; // on ajoute "world" à la fin
    cout << s << " a une longueur de " << s.size() << " caractères.";
    C'est plus clean que les char*, alloc machin et delete truc non ?

    Pour les fichiers, tu peux faire tes E/S comme avec les flux cin et cout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fstream fichier("chat.txt", ios::in | ios::out); // ouvre en lecture et écriture
    fichier << s; // Ecrit la chaîne s (qui peut être une string) dans le fichier
    string res; // Pour lire dans le fichier
    fichier.seekg(0); // On s'assure que le pointeur de lecture est au début
    fichier >> res; // La lecture et l'enregistrement se fait ainsi
    // en fin de bloc, le fichier est fermé automatiquement
    Même remarque que pour les chaînes.

    Enfin, il y a une petite erreur logique dans ton programme. Pourquoi fais-tu une fonction ecrire() et pas de fonction lire() ? Les deux processus présentent des ressemblances et on ne voit pas d'emblée que ton programme consiste seulement à écrire, puis lire. Bien découper en fonction aide le lecteur des sources à comprendre avec un minimum de commentaires (ceux que tu as mis sont d'ailleurs, à mon goût, inutiles - du genre "fonction fread qui lit le fichier puis enregistre", ça, tout le monde sait ce que fread veut dire alors pourquoi répéter ?).

    Ah oui, j'oubliais (mais c'est bientôt terminé), PAS DE VARIABLES GLOBALES QUAND TU NE T'EN SERS QUE DANS UNE FONCTION. La variable nom, qui est globale, ne sert, à ce que j'en vois, que dans ecrire(). Pourquoi est-elle globale dans ce cas ? Et puis tant que j'y suis, tu peux enregistrer les constantes magiques (256 est une longueur qui peut changer) dans une globale constante, au cas où tu utilises plusieurs fois ce chiffre dans ton prog, tu n'auras qu'à le changer qu'une fois.

    Sur ce, bonne chance dans tes développements et mes excuses pour avoir été un peu long sur ce message 8)

    Kwakanar

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 51
    Par défaut
    ok merci je vasi voir ca

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Kwakanar: La variable nom est utilisée dans l'écriture ET dans la lecture (dans le fread())
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 51
    Par défaut
    merci de toutes ces explications ==> j'ai reussi a faire marché mon programme mais quand j'entre mon nom , il me demande si je dois envoyer le "fameux" rapport d'erreur de windows! et la fenetre s'eteint .
    De plus rien n'a eté enregistrer dans le fichier !!
    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
    #include <cstdio> // Pour les fonctions sur les fichiers et printf()
    #include <cstdlib> // Pour system()
    #include <cstring> // Pour les fonctions sur les chaînes
    #include <iostream>
    using namespace std;
     
         char nom[20];
     
    /* Fonction écrire(), qui écrit dans un fichier non-créé */
    void ecrire(void)
    {
          cout<<"ENTRER VOTRE NOM"<<endl;
         cin >>  nom;
         FILE *fichier_config; // On déclare le pointeur
         fichier_config = fopen("chat.txt", "a"); // On ouvre (crée plutôt :o) le fichier (w)
         fprintf(fichier_config, nom); // On écrit dedans ;o)
         fclose(fichier_config); // Puis on ferme
         return ; // On met l'instruction return toute seule car la fonction est de type "void" (=vide ;o)
     
    }
     
    /* Fonction principale qui lit le fichier, et écrit dans la console */
    int main(int argc, char *argv[])
    {
         ecrire(); // On écrit dans le fichier avec la foncti
    on ecrire() définie plus haut :o)
     
         FILE *fichier;
         fichier = fopen("chat.txt", "w");
         char *texte_fichier; // On déclare une chaîne
     
         // Fonction fread() qui lit le fichier puis enregistre dans la chaîne "texte_fichier"
         fread(texte_fichier, sizeof(char),strlen(nom), fichier);
         printf("%s", texte_fichier);
         fclose(fichier); // /!\ On ferme le fichier /!\
         system("PAUSE");
         getchar();
         return 0; // Puis on quitte !!
    }

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           fichier = fopen("chat.txt", "w"); 
         char *texte_fichier; // On déclare une chaîne 
     
         // Fonction fread() qui lit le fichier puis enregistre dans la chaîne "texte_fichier" 
         fread(texte_fichier, sizeof(char),strlen(nom), fichier);
    Tu ouvres le fichier en écriture, pas en lecture !
    texte_fichier n'est pas un tableau de char mais un pointeur: tu n'a pas la place pour stocker les valeurs lues! -> Ca va planter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char texte_fichier[---];

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 51
    Par défaut
    oui merci j'ai modifié mais ca n'enregisrte toujours rien !

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fichier_config, nom);
    Manque le format du fprintf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fichier_config, "%s",nom);
    Attention, rajouter le 0 terminal dans texte_fichier apres le fread

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Par défaut
    Môssieu le modérateur (Aurélien) a marqué dans sa signature que "les char* c'est mal", et il a raison !!!!!!

Discussions similaires

  1. Ecrire \" dans un fichier
    Par photorelief dans le forum Langage
    Réponses: 2
    Dernier message: 14/09/2005, 15h56
  2. [JAR] Lire et Ecrire dans un fichier contenu dans un jar
    Par lipao17 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/05/2005, 12h01
  3. Ecrire dans un fichier
    Par gibet_b dans le forum Linux
    Réponses: 5
    Dernier message: 25/04/2005, 20h11
  4. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  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