Problème d'écriture dans un fichier ?
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Problème d'écriture dans un fichier ?



  1. #1
    sandrecarpe

    Problème d'écriture dans un fichier ?


    ------

    Bonjour à tous,

    J'ai classe Config qui est chargée de sauvegarder des informations de configuration pour mon application c++ sur Raspberry.
    J'ai une méthode saveParam qui permet de choisir la nouvelle donnée à sauvegarder dans le fichier et une fonction getParam qui permet de lire la donnée que je lui demande.
    Le fichier en question est structurée de la façon suivante :
    7 données consécutives codées chacune sur un octet, suivit par une donnée codée sur 4 octets.

    Ce dernier paramètre codé sur 4 octets contient le temps total pendant lequel mon tube fluo est resté allumé. Donc en fait je surveille l'état de la broche qui permet de contrôler l'éclairage de mon système grâce à une interruption.

    Voici la fonction d'interruption en question :
    Code:
    void Eclairage::chronoEclairageISR()
    {
    	using namespace std;
    
    	if(digitalRead(PIN_ECLAIRAGE) == HIGH)
    	{
    		_lastTime = chrono::system_clock::now();
    	}
    	else
    	{
    		//quand on éteint l'éclairage, on calcule pendant combien de temps il a été allumé
    		auto now = chrono::system_clock::now();
    		auto diff = chrono::duration_cast<chrono::minutes>(now - _lastTime).count();
    
    		Config config;
    		const int tempsEclairage = config.getParam(Config::PARAM::TEMPS_ECLAIRAGE) + diff;
    
    		config.saveParam(Config::PARAM::TEMPS_ECLAIRAGE, tempsEclairage);
    
    		cout << tempsEclairage << " minutes allumées" << endl;
    
    	}
    }
    A chaque fois que j'éteins la lumière (front descendant sur la broche surveillée), j'arrête le chrono et je stock le nouveau nombre d'heure dans le fichier avec Config::saveParam.
    La fonction Config::saveParam fonctionne. Elle écrit où j'ai besoin dans le fichier, et je n'ai pas non plus de problème pour lire les données dans le fichier.

    Voici maintenant la description du problème.
    Lorsque je lance mon programme dans la console, et que j'éteins la lumière, ma fonction d'interruption est lancée et le fichier est modifié. Tout va bien. En temps normal, ce programme est lancé au démarrage de l'OS, donc il tourne tout seul, mais là il ne veut plus m'écrire dans le fichier.
    J'ai redirigé la sortie de l'application dans un fichier pour voir ce qu'il se passe. La fonction d'interruption est bien appelée mais le fichier n'est pas modifié.

    Je vous passe au cas où ma fonction Config::saveParam

    Code:
    void Config::saveParam(const Config::PARAM param, const int newValue)
    {
    	using namespace std;
    
    	fstream file(_fileName.c_str(), fstream::out | fstream::in | fstream::binary);
    	file.exceptions (ifstream::failbit | ifstream::badbit);
    
    	try
    	{
    		file.seekp(param-1); //-1 car la première position dans le fichier est 0 et param commence à 1
    
    		int size = 0;
    		if(Config::PARAM::TEMPS_ECLAIRAGE == param)
    			size = sizeof(type_tps_eclairage);
    		else
    			size = sizeof(char);
    		
    	
    		char *buffer = new char[size];
    		memcpy(buffer, &newValue, size);
    		
    		file.write(buffer, size);
    		delete[] buffer;
    
    		file.close();
    	}
    	catch(const ifstream::failure& e)
    	{
    		cerr << "Impossible de sauvegarder les paramètres" << endl;
    	}
    }


    Avez-vous une suggestion ? D'où vient ce problème ?
    Ce problème m'embête pas mal, je vous remercie pour l'aide que vous pourriez m'apporter

    -----
    Dernière modification par sandrecarpe ; 12/05/2017 à 14h40.

  2. #2
    jacknicklaus

    Re : Problème d'écriture dans un fichier ?

    Code:
    const int tempsEclairage = config.getParam(Config::PARAM::TEMPS_ECLAIRAGE) + diff;
    Extrêmement bizarre ce const, pour déclarer ce qui, visiblement, n'est pas une constante puisque tu y additionne le contenu de diff.
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  3. #3
    sandrecarpe

    Re : Problème d'écriture dans un fichier ?

    J'initialise la variable avec une somme de 2 entiers.

    C'est un peu comme faire :
    Code:
    const int i = 6+2;
    Et après initialisation, en effet, la variable reste constante, d'où mon const
    Depuis quand on a pas le droit de faire ça ?
    Dernière modification par sandrecarpe ; 12/05/2017 à 15h34.

  4. #4
    jacknicklaus

    Re : Problème d'écriture dans un fichier ?

    il est clair que tu as "le droit", sinon le compilateur aurait hurlé.
    Fausse piste, donc.
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  5. A voir en vidéo sur Futura
  6. #5
    Paraboloide_Hyperbolique

    Re : Problème d'écriture dans un fichier ?

    Bonsoir,

    Est-ce qu'il n'aurait pas un problème au niveau de la valeur de la variable 'size' ? Je ne connais pas la taille du type 'type_tps_eclairage', mais pour le cas 'size = sizeof(char)' cela revient à copier un entier (en général 4 octets) dans un buffer qui peut n'avoir de la place que pour un char (en général 1 octet); ce qui me paraît bizarre (mais pas interdit par le compilateur).

    Code:
    if(Config::PARAM::TEMPS_ECLAIRAGE == param)
    			size = sizeof(type_tps_eclairage);
    		else
    			size = sizeof(char); // Taille 1 octet ?
    
    char *buffer = new char[size];
    memcpy(buffer, &newValue, size); // Variable de 4 octets copiée dans un buffer de 1 octet ?
    Dernière modification par Paraboloide_Hyperbolique ; 12/05/2017 à 19h27.

  7. #6
    sandrecarpe

    Re : Problème d'écriture dans un fichier ?

    Bonjour,
    Merci pour ta réponse

    type_tps_eclairage est un int (codé sur 2 octets sur Raspberry)

    pour le cas 'size = sizeof(char)' cela revient à copier un entier (en général 4 octets) dans un buffer qui peut n'avoir de la place que pour un char (en général 1 octet); ce qui me paraît bizarre (mais pas interdit par le compilateur).
    C'est complètement fait exprès.

    Comme expliqué dans mon premier post, mes données à enregistrer dans mon fichier font soit 1 octet soit 2 octets (j'ai fais une erreur dans ma description, ce n'est pas 4 octets, c'est 2 octets).

    newValue est un entier parce qu'il peut aussi contenir un char, je fais du deux-en-un
    Si on a newValue = 0x24 0x3A,
    faire un memcpy(buffer, &newValue, size) revient à prendre seulement les size premier octet de newValue

    Et si size vaut 1, buffer = 0x3A


    Si on size vaut sizeof(type_tps_eclairage) = 2
    Et bien on met les deux octets de newValue dans le buffer :
    buffer = 0x24 0x3A

    C'est un peu compliqué a expliqué, j'espère que cette petite explication est un minimum compréhensible

  8. #7
    pm42

    Re : Problème d'écriture dans un fichier ?

    Tu as essayé de mettre ton delete buffer[] après le file.close() ?

  9. #8
    sandrecarpe

    Re : Problème d'écriture dans un fichier ?

    Ca y est j'ai une piste !

    Alors en fait mon programme est lancé à chaque démarrage de linux. Dans mon crontab, j'ai cette ligne :
    @reboot /home/pi/projet_aquarium/V4/output >> /home/pi/projet_aquarium/V4/terrariumOutput.log

    Dans le dossier /home/pi/projet_aquarium/V4 j'ai plusieurs fichier dans lequel lit et écrit mon application, et je viens de voir que linux copie tout ça dans le répertoire /root et travaille ensuite dans celui-ci
    Et en effet, ce n'est pas le fichier /home/pi/projet_aquarium/V4/terrarium.config qui est modifié par saveParam mais /root/terrarium.config !

    Pourquoi il travaille pas dans le répertoire /home/pi/projet_aquarium/V4 ?
    J'avais jamais fait attention à ça mais ça peut m'être problématique si j'ai besoin de modifier mon fichier de configuration manuellement (même si ça n'arrive normalement pas) car l'application prend en compte que les fichier dans /root
    Comment je le force à travailler dans mon répertoire ?
    Y a t-il une autre solution ?
    Dernière modification par sandrecarpe ; 12/05/2017 à 21h05.

  10. #9
    Chanur

    Re : Problème d'écriture dans un fichier ?

    Citation Envoyé par sandrecarpe Voir le message
    faire un memcpy(buffer, &newValue, size) revient à prendre seulement les size premier octet de newValue
    Oui, et les size premiers octets de newValue dépendent du fait que ta machine soit en Little Endian ou en Big Endian.
    Il se peut que ça marche, mais déjà c'est pas du tout portable.
    Il vaudrait mieux faire une copie de NewValue dans une variable char.
    Pour être clair tu peux écrire explicitement :
    unsigned char value = NewValue & 0xff;
    ou alors (c'est pareil)
    unsigned char value = NewValue % 256;
    Dans ce cas, on prend à coup sûr les bits de poids faible.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  11. #10
    Chanur

    Re : Problème d'écriture dans un fichier ?

    Citation Envoyé par sandrecarpe Voir le message
    Comment je le force à travailler dans mon répertoire ?
    En lançant depuis le cron un script shell qui lance ton programme après s'être placé dans le répertoire adéquat, par exemple.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  12. #11
    sandrecarpe

    Re : Problème d'écriture dans un fichier ?

    unsigned char value = NewValue & 0xff;
    ou alors (c'est pareil)
    unsigned char value = NewValue % 256;
    Ah oui c'est pas mal ça !


    En lançant depuis le cron un script shell qui lance ton programme après s'être placé dans le répertoire adéquat, par exemple
    Ah oui ça aussi !


    Bon bah je vais voir ce que ça donne, merci !

Discussions similaires

  1. écriture dans un fichier
    Par Zero Cold dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 24/01/2016, 21h44
  2. Ansys Classic: écriture dans un fichier en colonne
    Par invite0ca9c1dd dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 13/03/2011, 15h40
  3. Matlab Lecture de n fichier .txt et ecriture dans un fichier .xls
    Par invite24513ab6 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 26/07/2010, 09h12
  4. Ecriture dans un fichier text à partir d'un service JSP
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 28/06/2009, 22h31
  5. Fortran : écriture dans un fichier
    Par Coincoin dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 16/01/2006, 19h32