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 :

Problème dans l'écriture dans un fichier texte depuis un programme C


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    On a pas fini d'apprendre
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : On a pas fini d'apprendre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Points : 12
    Points
    12
    Par défaut Problème dans l'écriture dans un fichier texte depuis un programme C
    Bonjour à tous,
    je voulais écrire dans un fichier texte le résultat d'un test, j'écrit 0 ou 1 suivant l'état du test, le problème c'est qu'au début et pendant à peu près une minute, le programme fonctionne à merveille sauf qu'après le programme n'écrit plus dans le fichier. Est ce que vous pensez que ce problème est lié au tampon???

    voici le 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
     
    void Enregis_Fichier()
    {
    	FILE * pFile;
    	if(objet==true) //la variable globale objet change de valeur dans la
                                 //fonction Test()
            {
    	  //Ecriture fichier Test.txt
    	  ofstream objetfichier("TEST.txt", ios::app);
                  if(objetfichier)
                  {
    			 rewind (pFile);
    			 objetfichier<<"1"<<endl;
                             fflush(stdout);
    			 objetfichier.close();		
    	      }
             }
             else if(objet==false)//la variable globale objet change de valeur dans la
                                        //fonction Test()
             {
    		ofstream objetfichier("TEST_OBSTACLE.txt", ios::app);
    		if(objetfichier)
    		  {	
    		       rewind (pFile);
    		       objetfichier<<"0"<<endl;
                           fflush(stdout);
    		       objetfichier.close();
    		  }
             }
    }
     
    int main(int argc, char* argv[])
    {
       while (!WasKeyboardHit())
       {
          Test();
          Enregis_Fichier();
           if (objet==true)//la variable globale objet change de valeur dans la
                                 //fonction Test()
           {
             printf("\nTest est juste:1");
             fflush(stdout); 
           }
          else 
          {
             printf("\nTest est faut:1");
             fflush(stdout); 
          }
        }
    return 0;
    }
    merci d'avance pour votre aide, surtout que je suis dans l'urgence j'ai que peu de temps pour résoudre ce problème

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ton code est écrit en C++, il est donc du ressort du forum C++.

    Quelques remarques cependant :
    • à quel moment pFile est associé à l'ouverture d'un fichier ? rewind() : pourquoi faire ?
    • pour utiliser printf en C++ ? cout est ton ami.
    • pourquoi faire fflush(stdout); alors que tu écris dans un fichier. C'est ton flux de fichier qu'il faut flusher.

  3. #3
    Membre à l'essai
    Homme Profil pro
    On a pas fini d'apprendre
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : On a pas fini d'apprendre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Points : 12
    Points
    12
    Par défaut Problème dans l'écriture dans un fichier texte depuis un programme C
    Citation Envoyé par Bktero Voir le message
    Ton code est écrit en C++, il est donc du ressort du forum C++. Un modérateur pourrait-il déplacer le sujet ?


    Quelques remarques cependant :
    • à quel moment pFile est associé à l'ouverture d'un fichier ? rewind() : pourquoi faire ?
    • pour utiliser printf en C++ ? cout est ton ami.
    • pourquoi faire fflush(stdout); alors que tu écris dans un fichier. C'est ton flux de fichier qu'il faut flusher.
    je te remercie Bktero pour ta réponse rapide,
    effectivement comme tu as remarqué, dans mon code j'ai mélangé le langage C et C++ mais ce-là vient du-fait que je suis débutant et je mélange les pinceaux.
    alors la fonction rewind() sert à écrire toujours sur le début de la même ligne dans le fichier texte parce que dans le fichier texte je veux mettre un seul caractère 0 ou 1 .
    Pour pFile cette ligne c'est un commentaire parce que qu'au début j'ai utilisé la méthode d'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pFile = fopen ("TEST.txt","w+");//pour ou8vrire le fichier Test.text
    Au lieu de l'ouverture avec la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ofstream objetfichier("TEST.txt", ios::app);
    comment faire pour flusher le flux d'un fichier texte?
    merci

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    On ne mélange pas le C et le C++. Soit on fait du C, soit on fait du C++. Le C++ étant un héritier du C, il en reprend certains fonctions. Printf est une fonction C++ dans ton cas, mais C++ propose d'autres mécanismes d'entrée-sorties qui sont plus utilisés.

    alors la fonction rewind() sert à écrire toujours sur le début de la même ligne dans le fichier texte parce que dans le fichier texte je veux mettre un seul caractère 0 ou 1 .
    Rewind ne sert pas à revenir au début de la ligne mais au début du fichier. De plus, pFile n'étant pas associé à un fichier, tu ne rewind rien du tout. Enleve tout ce qui parle de pFile si tu ne t'en sers plus. Ensuite, quand tu ouvres le fichier, le pointeur de flux est placé au début du fichier. Ca ne sert à rien de faire rewind sur un fichier que tu viens d'ouvrir. Si ios::app est la même chose que ios_base::app, alors tu écris à la fin de ton fichier :
    Citation Envoyé par http://www.cplusplus.com/reference/iostream/ofstream/ofstream/
    (append) Set the stream's position indicator to the end of the stream before each output operation.
    Cela n'enlève rien au fait que rewind ne ramène pas au début de la ligne.

    comment faire pour flusher le flux d'un fichier texte?
    Il faut regarder la documentation des classes que tu utilises : http://www.cplusplus.com/reference/iostream/ofstream/
    Tu peux voir qu'il y a une méthode flush.

  5. #5
    Membre à l'essai
    Homme Profil pro
    On a pas fini d'apprendre
    Inscrit en
    Mars 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : On a pas fini d'apprendre
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2010
    Messages : 43
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Bktero Voir le message
    On ne mélange pas le C et le C++. Soit on fait du C, soit on fait du C++. Le C++ étant un héritier du C, il en reprend certains fonctions. Printf est une fonction C++ dans ton cas, mais C++ propose d'autres mécanismes d'entrée-sorties qui sont plus utilisés.


    Rewind ne sert pas à revenir au début de la ligne mais au début du fichier. De plus, pFile n'étant pas associé à un fichier, tu ne rewind rien du tout. Enleve tout ce qui parle de pFile si tu ne t'en sers plus. Ensuite, quand tu ouvres le fichier, le pointeur de flux est placé au début du fichier. Ca ne sert à rien de faire rewind sur un fichier que tu viens d'ouvrir. Je présume qu'en fait ios::app signifie que tu ouvres le fichier en mode 'append'. Auquel cas, tu es a la fin du fichier, et non au début. Ca n'enlève rien au fait que rewind ne te ramène pas au début de la ligne.


    Il faut regarder la documentation des classes que tu utilises : http://www.cplusplus.com/reference/iostream/ofstream/
    Tu peux voir qu'il y a une méthode flush.
    merci pour ton aide précieuse,
    j'ai nettoyé le code comme il faut et ca marche très bien mais je suis sur qu'il y à mieux voici ce que j'ai fais:
    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
     
    void Enregis_Fichier()
    {
    	FILE * pFile;
            FILE * pFile1;
    if(objet==true)
        {
    	pFile = fopen ("TEST.txt","w+");
    	if(pFile)
    	{
    		fputc('1', pFile);
    		fclose (pFile);
    	}
         }
    else
        {
    	pFile1 = fopen ("TEST.txt","w+");
    	if(pFile1)
    	{
    		fputc('0', pFile1);
    		fclose (pFile1);
    	}
         }
    }
    Là au moins on est plein dans le langage C

    merci encore Bktero

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Là, on est en plein langage C. ^^

    Une différence entre ce code et le précédent : ici, tu as un seul caractère dans tes fichiers, ; dans l'autre, une nouvelle ligne à chaque fois.

    Voilà une version purement C++ qui me semble ok :
    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
    59
    60
    61
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    bool objet = false;
     
    void Enregis_Fichier()
    {
    	if(objet==true)
        {
            //Ecriture fichier Test.txt
            ofstream objetfichier("TEST.txt", ios_base::app);
            if(objetfichier)
            {
                objetfichier << "1" << endl;
                objetfichier.flush();
                objetfichier.close();
            }
        }
        else if(objet==false)
        {
            ofstream objetfichier("TEST_OBSTACLE.txt", ios_base::app);
            if(objetfichier)
            {
                objetfichier << "0" << endl;
                objetfichier.flush();
                objetfichier.close();
            }
        }
    }
     
    void Test(void)
    {
        if(objet == true)
            objet = false;
        else if(objet == false)
            objet = true;
    }
     
    int main(int argc, char* argv[])
    {
        int i = 100000;
        while (1)
        {
            Test();
            Enregis_Fichier();
     
            if (objet==true)
            {
                cout << "Test est faux:1" << endl;
                cout.flush();
            }
            else
            {
                cout << "Test est juste:1" << endl;
                cout.flush();
            }
        }
        return 0;
    }

Discussions similaires

  1. Écriture d'un fichier texte depuis un formulaire
    Par Hallo310 dans le forum Langage
    Réponses: 4
    Dernier message: 09/08/2009, 17h37
  2. Problème de caractère dans l'écriture d'un fichier
    Par Oberown dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/07/2007, 10h55
  3. Réponses: 5
    Dernier message: 20/03/2006, 12h35
  4. Réponses: 3
    Dernier message: 18/08/2005, 11h57

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