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 d'affichage dans un fichier en Visual C++


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut Problème d'affichage dans un fichier en Visual C++
    Bonjour,

    j'ai un problème avec l'affichage d'un tableau de type TCHAR dans un fichier.txt. il m'affiche des symboles en plus. je bosse sur un grand projet et le code est énorme donc je donne l'essentiel du 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
    TCHAR Resultat [1024]
    TCHAR  Fichier[64];
     
    swprintf (Fichier, TEXT("Sauvegarde_du_%i_%i_%i_a_%i_%i_%i.txt"), dateCreaFichier.wDayOfWeek,dateCreaFichier.wMonth,dateCreaFichier.wYear,dateCreaFichier.wHour,dateCreaFichier.wMinute,dateCreaFichier.wSecond);
     
    	hFile = CreateFile (
                                      Fichier,     // file to create
    				   GENERIC_WRITE,          // open for writing
    				   0,                      // do not share
    				   NULL,                   // default security
    				   CREATE_ALWAYS,          // overwrite existing
    				   FILE_ATTRIBUTE_NORMAL | // normal file
    				   FILE_FLAG_RANDOM_ACCESS,   // asynchronous I/O
    				   NULL
                                   );                  // no attr. template
     
    swprintf (Resultat, L"%s %i:%i:%i DISCONNECTED\n", Resultat, timerApp.wHour, timerApp.wMinute,timerApp.wSecond);
     
    WriteFile(hFile,Resultat,sizeof(Resultat),&octetEcrit,NULL);
     
    CloseHandle(hFile);

  2. #2
    Membre éclairé Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Pour moi ça viens du fait que t'initialise pas tes tableaux.

    Quand tu déclare tabelau Resultat tu lui réserves 1024 octets, mais tu sais pas ce qui peut bien y avoir la dedans.

    Les fonctions classique de gestion de chaine s'arretent au '\0' de fin de chaine ce qui règle le problème, peut importe ce qu'il y a apres il ira pas l'afficher/lire ou autres.

    Dans le cas de ton write File tu lui demandes d'écrire la totalité de ton tableau. donc les caractères qui suivent ta chaine aussi.

    tu devrais juste initialisé ton tableau à sa déclaration

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TCHAR Resultat [1024] = {""};
    Ainsi tout ce qui n'est pas ta chaine sera rempli par des caractères nuls

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut
    Bonjour,
    Merci pour votre aide. la façon dont vous avez initialiser le tableau il me signale une erreur de type :

    " .\SpyCall.cpp(46) : error C2440: 'initializing' : cannot convert from 'const char [1]' to 'TCHAR'"

    j'ai corrigé l'erreur :

    TCHAR Resultat [1024] = {'\0'};

    et le problème persiste c'est le même affichage que j'en avais avant.
    Merci

  4. #4
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    déjà il faut que tu choisis entre TCHAR ou WCHAR parce que là tu mélanges les deux

    TCHAR donne sur un char si le symbole _UNICODE n'est pas défini, ou un wchar_t si il est défini. avec des TCHAR on utilise des fonctions qui commence par le préfixe _t... (pour la plupart), ex: _tcslen() donne sur strlen() si _UNICODE n'est pas défini ou wcslen() si il est défini. (je fais l'impasse sur _MBCS)

    alors au lieu d'utiliser swprintf, utilises _stprintf

    bon sinon ton probleme c'est que tu écris tout le buffer, donc 4096 caractères, dans le fichier a cause du sizeof()

    tu devrais recuperer le nombre retourner par _stprintf() qui est le nombre de caractères écrit dans le buffer, et le multiplier par sizeof(TCHAR) pour avoir la taille en octets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int length=_stprintf (Resultat, TEXT("%s %i:%i:%i DISCONNECTED\n"), Resultat, timerApp.wHour, timerApp.wMinute,timerApp.wSecond);
    WriteFile(hFile,Resultat,length*sizeof(TCHAR),&octetEcrit,NULL);
    @+

    EDIT: c'est pas une manière "propre" pour faire une concaténation le TEXT("%s") avec Resultat (qui est la destination) - bien que dans ce cas ça marche, dans d'autres cas tu auras des problemes d'effet de bord ... --> sépare les buffers

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut
    Salut,

    Merci beaucoup ça marche. s'il te paît peut tu m'expliquer c'est quoi un " symbole _UNICODE "? car j'ai cherché mais je n'arrive pas à bien l'assimilé.

    encore Merci pour tes conseilles

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut
    ReSalut,

    bain la fonction marche mais a chaque exécution il y a un carreau entre chaque caractère! s'il vous plaît, quelqu'un puisse m'aidé???

    int length=_stprintf (Resultat,L"%s%i:%i:%iDISCONNECTED",Resultat, timerApp.wHour,timerApp.wMinute,timerApp.wSecond);

    WriteFile(hFile,Resultat,length*sizeof(TCHAR),&octetEcrit,NULL);

    Merci

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    1. Déjà, pourquoi as-tu remplacé le _T() par un L alors que tu bosses avec des TCHAR?
    2. Ensuite, il faut savoir dans quoi tu vois "un carreau entre chaque caractère". Si c'est dans le bloc-notes, ça veut dire que le fichier ne contient pas que des caractères écrits ainsi (ou bien, que tu utilises une très vieille version du bloc-notes).
    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.

  8. #8
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut
    j'ai pas remplacé _T() par L; erreur: j'ai pas recopié la bonne fonction c tt

    int length=_stprintf (Resultat,TEXT("%s%i:%i:%iDISCONNECTED"),Resultat, timerApp.wHour,timerApp.wMinute,timerApp.wSecond);

    Pr l'affichage je visualise dans un smartphone

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ton smartphone ne supporte peut-être pas le texte en UCS-2 ou UTF-16...

    Sinon, peut-être qu'il attend une BOM (byte-order mark).
    Essaie un truc comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int length=_stprintf (Resultat, TEXT("%s %i:%i:%i DISCONNECTED\n"), Resultat, timerApp.wHour, timerApp.wMinute, timerApp.wSecond);
    #ifdef UNICODE
    WORD wBOM = 0xFEFF;
    WriteFile(hFile, &wBOM, sizeof(WORD), &octetEcrit, NULL);
    #endif
    WriteFile(hFile, Resultat, length*sizeof(TCHAR), &octetEcrit, NULL);
    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.

  10. #10
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 18
    Par défaut
    Merci beaucoup sa marche très très bien

Discussions similaires

  1. Problème d'affichage dans un fichier suite à un dir>fichier.txt
    Par paix02200 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 20/08/2007, 12h53
  2. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  3. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00
  4. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  5. Réponses: 2
    Dernier message: 01/06/2004, 12h47

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