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

Visual C++ Discussion :

exception lors de l'écriture dans un fichier


Sujet :

Visual C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut exception lors de l'écriture dans un fichier
    bonjour,
    de l'aide serait la bienvenue,

    j'utilise une console windows fournie gracieusement par Farscape dans la FAQ VC++, que j'ai adaptée à mes besoins de debuggage. Elle affiche des traces et remplit également un fichier texte.

    j'ai défini mon objet console dans la classe de ma boite de dlg principale. je l'ouvre en même temps que ma fenêtre principale.
    je fait appel à cet objet depuis d'autres classes. Toutes affichent et écrivent les traces dans le fichier sauf une.
    celle-ci affiche correctement le message dans la console mais quand il s'agit d'écrire le fichier de trace avec writestring, j'ai une exception avec le message
    disque plein lors de l'accès au fichier f:\trace.log.
    bien sûr, le disque n'est pas plein.
    le fichier n'est pas protégé en écriture, ni ouvert en exclusif, ni par un autre processus.

    j'ai une dizaine de classes qui font appel sans erreur à cette console. j'emploie toujours la même méthode pour y accéder.

    quelqu'un a-t-il une idée, please ?
    merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Avec du code, c'est bien plus simple.
    Avez-vous vérifié les paramètres d'appel ?
    Il y a peut-être une longueur de chaine trop longue ? (la longueur, pas la chaîne)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    voici le code en faute (je suppose)

    fait appel à la console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CConnexionCameraDome::CConnexionCameraDome(const PCAMERA Cam)
    {
    	// On récupère le handle de la boite de dialogue parente
    	CDlgMFCDlg*	pMainDlg=static_cast<CDlgMFCDlg *>(AfxGetMainWnd());
     
    	pMainDlg->m_ConsoleDEBUG.DebugPrintf("connexion camera dome a partir de adr STRUCT");
    //...
    }
    la fonction de la classe console avec le writestring en faute
    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
     
    // Use DebugPrintf like TRACE0, TRACE1, ... (The arguments are the same as printf)
    void CConsole::DebugPrintf(const char *szfmt, ...)
    {
    //#ifdef _DEBUG
        char s[300];
        va_list argptr;
        int cnt;
     
        va_start(argptr, szfmt);
        cnt = vsprintf(s, szfmt, argptr);
        va_end(argptr);
     
        DWORD cCharsWritten;
        if(m_hStdOut)
        {
            DebugNewLine();
            WriteConsole(m_hStdOut, s, strlen(s), &cCharsWritten, NULL);
        }
     
        if(m_stdFileDebug.m_pStream!=NULL) 
        {
            CString str = "";
    		str.Format("%s\r\n",s);      
            //str+="";        
            m_stdFileDebug.WriteString(str);        
        }
     
    //#endif
    }
    merci
    Nicolassar

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Votre code n'est plus du C++, c'est même du C--.

    Le "char s[300];" va vous mettre dans la panade.
    "strlen(s)" peut vous donnez une valeur abracadabrantesque.
    etc.

    Vérifiez le contenu de la variable s lors de l'envoi de l'exception.
    N'oubliez pas que vous pouvez configurer VS pour arrêter le processus en cours de debugging au moment du lancement d'une exception, même quand elle est "catchée" par le programme.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    vu
    j'ai revérifié la valeur de s qui est cohérente jusqu'à l'exécution du writestring.

    pour debugger j'utilise les points d'arrets et la pile d'appel.
    ça m'intéresse de savoir comment configurer VS pour
    arrêter le processus en cours de debugging au moment du lancement d'une exception, même quand elle est "catchée" par le programme.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Sous VS2008

    Menu Debug -> Exceptions... -> Choisissez le type d'exception et checkez la colonne "Throw"

Discussions similaires

  1. Blocage lors de l'écriture dans un fichier
    Par yoyostras dans le forum Débuter
    Réponses: 7
    Dernier message: 26/06/2007, 15h16
  2. Problème lors de l'écriture dans un fichier.
    Par captainflex dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 16/05/2007, 13h42
  3. Réponses: 8
    Dernier message: 13/11/2006, 11h19
  4. Erreur E/S 32 lors de l'écriture dans un fichier text.
    Par yosthegost dans le forum Delphi
    Réponses: 6
    Dernier message: 01/06/2006, 11h45
  5. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25

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