Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon programme crée un fichier txt binaire

Tout le texte s'affiche mais pas les nombres.

3 juin 2007 à 19:11:21

Voilà bonjour à tous !
J'ai (de nouveau...) un problème, j'ai crée un programme qui me permet de calculer le temps de travail par semaine en demandant à l'utilisateur de saisir ses heures d'arrivées et ses heures de sorties.
Le tout doit au final créer un fichier texte avec un tableau à double entrée les jours en fonction des heures de travails, le total en enlevant 3/4 d'heures et le cumul.
Le problème c'est que mon programme me crée apparement un fichier binaire puisque lorsque je l'ouvre avec kate j'ai le message d'erreur suivant :
Le fichier "file:///home/matarc/Programme/Horaire/Semaine%20n12.txt" est binaire, l'enregistrer  créera un fichier corrompu.

Tout ce qui est texte s'affiche sans problème, seul les chiffres ne veulent pas s'afficher.
J'ai pu établir les différentes possibilités de sources d'erreurs, elles peuvent venir seulement de ces points là:
  • Une erreur dans l'ouverture de fichier.
  • Une erreur dans les fonctions d'affichages ou de surcharge d'opérateur de flux.
  • Une erreur dans la récupération des horaires et donc dans la surcharge d'opérateur de flux.

J'ai donc indiquer par un commentaire les différents endroits ou il se pourrait qu'il y ait un problème.
Je n'ai pourtant pas demander une ouverture en mode binaire de fichier, voilà le code (pas très beau).
Main.cpp
#include "Horaire.h"
#include "Jour.h"
#include <fstream>

using namespace std;

 int main()
{
        bool continuer = true;
        while(continuer)
        {
                string semaine = "Semaine n°";
                string num;
                cout <<"Entree le numero de la semaine : ";
                cin>>num;
                semaine+=num;
                num=semaine;
                semaine+=".txt";
               
               
                ofstream fichier(semaine.c_str(),ofstream::out|ofstream::trunc); //La création du fichier il peut y              avoir une erreur
                fichier<<num<<endl<<endl;
                fichier<<"\t\tArrivée\t\tSortie\t\tTotal-3/4h\tCumul"<<endl;
                Jour *jours;
                jours = new Jour[7];
                jours[0].SetJour("Lundi");
                jours[1].SetJour("Mardi");
                jours[2].SetJour("Mercredi");
                jours[3].SetJour("Jeudi");
                jours[4].SetJour("Vendredi");
                jours[5].SetJour("Samedi");
                jours[6].SetJour("Dimanche");
                cout<<"Vous devez taper l'heure de la facon suivante : XXhYY."<<endl;
                cout<<"XX represente les heures et YY les minutes."<<endl;
                unsigned char i= 0;
                Horaire horaire;
                for(i = 0;i<7;i++)
                {
                        cout<<jours[i].GetJour()<<" Heure d'arrivee : ";
                        cin >>horaire;
                        jours[i].SetArrivee(horaire);
                        cout<<jours[i].GetJour()<<" Heure de sortie : ";
                        cin>>horaire;
                        jours[i].SetSortie(horaire);
                        if ((i-1)<0)
                        {
                                jours[i].Calcul(jours[i]);
                        }
                        else
                        {
                                jours[i].Calcul(jours[i-1]);
                        }
                        fichier<<jours[i];
                }
                bool recommencer = true;
                while(recommencer)
                {
                        cout<<"Voulez vous effectuer une nouvelle saisie ?"<<endl;
                        cout<<"Si oui tapez o puis entree sinon tapez n puis entree : ";
                        string reponse;
                        cin>>reponse;
                        if (reponse =="o")
                        {
                                recommencer = false;
                        }
                        else if (reponse =="n")
                        {
                                return 0;
                        }
                        else
                        {
                                cout<<"Saisie invalide veuillez recommencer"<<endl;
                                continue;
                        }
                }
                continue;
        }
               
       
       
        return 0;
}

Jour.h
#ifndef DEF_JOUR
#define DEF_JOUR
#include "Horaire.h"

class Jour
{
        public:
                /*Constructeur par défaut*/
                Jour();
                /*Constructeur*/
                Jour(Horaire &arrivee, Horaire &sortie);
                /*Constructeur*/
                Jour(std::string nomJour);
                /*Changer le nom du jour*/
                void SetJour(std::string nomJour);
                /*Changer l'horaire d'arrivée*/
                void SetArrivee(Horaire &arrivee);
                /*Changer l'horaire de sortie*/
                void SetSortie(Horaire &sortie);
                /*Lire le nom du jour*/
                std::string GetJour();
                /*Lire l'horaire d'arrivée*/
                Horaire GetArrivee();
                /*Lire l'horaire de sortie*/
                Horaire GetSortie();
                /*Calcul du total et du cumul*/
                void Calcul(const Jour &jour);
                /*Afficher le jour*/
                void Afficher(std::ostream &out);
                               
        private:
                /*Heure d'arrivée*/
                Horaire m_arrivee;
                /*Heure de sortie*/
                Horaire m_sortie;
                /*Total-3/4h*/
                Horaire m_total;
                /*Cumul*/
                Horaire m_cumul;
                /*Nom du jour*/
                std::string m_nomJour;
               
};

std::ostream &operator<<(std::ostream &out,Jour &jour);

#endif

Jour.cpp
#include "Jour.h"

using namespace std;

Jour::Jour()
{
        Horaire zero;
        m_arrivee = m_sortie = m_total = m_cumul = zero;
}
Jour::Jour(Horaire &arrivee,Horaire &sortie)
{
        m_arrivee = arrivee;
        m_sortie = sortie;
}
Jour::Jour(string nomJour)
{
        m_nomJour = nomJour;
}
void Jour::SetJour(string nomJour)
{
        m_nomJour = nomJour;
}
void Jour::SetArrivee(Horaire &arrivee)
{
        m_arrivee = arrivee;
}
void Jour::SetSortie(Horaire &sortie)
{
        m_sortie = sortie;
}
string Jour::GetJour()
{
        return m_nomJour;
}
Horaire Jour::GetArrivee()
{
        return m_arrivee;
}
Horaire Jour::GetSortie()
{
        return m_sortie;
}
void Jour::Calcul(const Jour &jour)
{
        m_total = (m_sortie-m_arrivee);
        Horaire troisquart(0,45);
        m_total = m_total- troisquart;
        m_cumul = m_total + jour.m_cumul;
}
void Jour::Afficher(ostream &out) //Affichage de toutes les données d'une journée, une autre possible source d'erreur
{
        out<<m_nomJour;
        if ((m_nomJour.size())<8)
        {
                out<<"\t\t";
        }
        else
        {
                out<<"\t";
        }
        out<<m_arrivee<<"\t\t"<<m_sortie<<"\t\t"<<m_total<<"\t\t"<<m_cumul<<endl;
}



ostream &operator<<(ostream &out,Jour &jour) //Une surcharge d'opérateur de flux une autre possible source d'erreur
{
        jour.Afficher(out);
        return out;
}

Horaire.h
#ifndef DEF_HORAIRE
#define DEF_HORAIRE
 
#include <ctime>
#include <string>
#include <iostream>

class Horaire
{
        public:
                /*Constructeur par défaut*/
                Horaire();
                /*Constructeur*/
                Horaire(unsigned char heure,unsigned char minute);
                /*Récupération d'un horaire*/
                void Recuperer(std::istream &in);
                /*Opérateur de soustraction*/
                Horaire operator-(const Horaire &horaire);
                /*Opérateur d'addition*/
                Horaire operator+(const Horaire &horaire);
                /*Opérateur d'affectation*/
                Horaire operator=(const Horaire &horaire);
                /*Afficher un horaire*/
                void Afficher(std::ostream &out);
        private:
                unsigned char m_heure;
                unsigned char m_minute;
               
};

std::istream &operator>>(std::istream &in,Horaire &horaire);
std::ostream &operator<<(std::ostream &out,Horaire &horaire);

#endif

Horaire.cpp
#include "Horaire.h"

using namespace std;
 
 Horaire::Horaire()
{
        m_heure = 0;
        m_minute = 0;
}
Horaire::Horaire(unsigned char heure,unsigned char minute)
{
        m_heure = heure;
        m_minute = minute;
}
void Horaire::Recuperer(istream &in) //Récupération des horaires une autre possible source d'erreur
{
        struct tm tm;
        string str;
        in>> str;
        strptime(str.c_str(),"%Hh%M",&tm);
        m_heure = tm.tm_hour;
        m_minute = tm.tm_min;
       
}
Horaire Horaire::operator-(const Horaire &horaire)
{
        unsigned char heure = m_heure;
        unsigned char minute = m_minute;
       
        if ((minute-horaire.m_minute)<0)
        {
                minute+=60;
                minute-=horaire.m_minute;
                heure-=horaire.m_heure;
                heure-=1;
        }
        else
        {
                minute-=horaire.m_minute;
                heure-=horaire.m_heure;
        }
       
        Horaire resultat(heure,minute);
        return resultat;
}
Horaire Horaire::operator+(const Horaire &horaire)
{
        unsigned char heure = m_heure;
        unsigned char minute = m_minute;
       
        if ((minute+horaire.m_minute)>=60)
        {
                minute+=horaire.m_minute;
                minute-=60;
                heure+=horaire.m_heure;
                heure+=1;
        }
        else
        {
                minute+=horaire.m_minute;
                heure+=horaire.m_heure;
        }
       
        Horaire resultat(heure,minute);
        return resultat;
}
Horaire Horaire::operator=(const Horaire &horaire)
{
        m_heure = horaire.m_heure;
        m_minute = horaire.m_minute;
        return *this;
}
void Horaire::Afficher(ostream &out) //Affichage des horaires une autre possible source d'erreur
{
        out<<m_heure<<"h"<<m_minute;
}







 istream &operator>>(istream &in,Horaire &horaire) //Opérateur de Flux
{
        horaire.Recuperer(in);
        return in;
}
ostream &operator<<(ostream &out,Horaire &horaire) // Opérateur de Flux
{
        horaire.Afficher(out);
        return out;
}

Voilà pouvez m'aider ?
Merci d'avance. :)
  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 11:33:20

Met les balises pour le code stp si tu est encore en vie mdr :waw:
  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 17:05:02

J'ai regardé en diagonal, mais m_heure et m_minute sont des unsigned char, donc des caractères. La valeur 37 (par exemple), ne représente absolument pas les caractères "37", mais le caractère '%' (voir la table ascii). Le plus simple est d'utiliser un autre type, soit au moment de l'écriture (out << unsigned(m_heure)), soit sur la déclaration du membre.

Sinon concernant le code:

  • Toutes les fonctions de Jour ne servent à rien. En l'état autant tout mettre public et ne garder que Calcul.
  • Il ne devrait pas y avoir de fonction Afficher, cela fait double avec operator<<
  • La plupart des fonctions membre devrait être marquée const, car elle me modifie pas les membres.
  • operator= et constructeur par défaut font trop de chose: le compilateur fait mieux que toi, utilise =default;
  • Initialise les variables en même temps qu'elles sont déclarées, y comprit dans les classes/structures.
  • Utilise la liste d'initiation
  • N'utilise pas using namespace std, des explications et des liens pullulent sur le forum, mais grosso-modo cela peut engendrer des conflits avec ton code ou celui d'autre bibliothèque.
  • Il n'y a aucune raison d'utiliser new. Premièrement parce que std::unique_ptr est beaucoup plus approprié et cela t'éviterais la fuite mémoire (tu ne fais jamais de delete). Deuxièmement, car il n'y a aucune raison de faire une allocation dynamique pour un objet qui peut être sur la pile. std::array jours{Jour("Lundi"), Jour("Mardi"),.....};

Dans l'ensemble, le code est mal fichu tu devrais changer de cours, par exemple te dirige vers celui de zeste de savoir: https://zestedesavoir.com/contenus/beta/822/la-programmation-en-c-moderne/

  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 21:31:39

@PatateTofu merci de ne pas déterrer d'ancien sujet. /!\ sujet de 2007 

merci @jo_link_noir pour sa réponse constructive.

Je ferme ce sujet tout de même, si Matarc le souhaites je peux le rouvrir.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter