begin process at 2010 02 10 03:31:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

Pb Edition de Texte !!!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pb Edition de Texte !!!

mardi 4 novembre 2008 à 15:59:29 | Pb Edition de Texte !!!

ElectricalMan

Bonjour, j'ai un petit soucis en voulant sauvegarder le contenu d'une EditBox dans un fichier; j'ai que la moitier du contenu qui est sauvegardé !

OPENFILENAME ofn;
TCHAR szFile[_MAX_PATH]={0};

ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize =
sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile =
sizeof(szFile);
ofn.lpstrFilter = L
"Fichiers Texte(*.TXT)\0*.txt\0Tous les fichiers(*.*)\0*.*\0";
ofn.nFilterIndex = 0;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;

if (GetSaveFileName(&ofn)==TRUE)
{
   HANDLE hFile, hBuffer;
   DWORD FileSize, nbcharRead=0 ;
   
   FileSize = GetWindowTextLength(hWndEdit);
   hBuffer = (HANDLE)SendMessage(hWndEdit, EM_GETHANDLE, 0, 0L);
   hBuffer = LocalLock(hBuffer);
   hFile = CreateFile(szFile, GENERIC_READ|GENERIC_WRITE, 0,NULL,
   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   WriteFile(hFile, hBuffer, FileSize, &nbcharRead, NULL) ;

  wsprintf((LPWSTR)szBuffer,L"%d",nbcharRead);
   MessageBox(NULL, (LPCWSTR) szBuffer, (LPCWSTR)L"nbcharRead", MB_OK);   => pourtant ça donne la longueur correct

   CloseHandle(hFile);
   LocalUnlock(hBuffer);
}


Avez vous une idée ?

mardi 4 novembre 2008 à 18:42:21 | Re : Pb Edition de Texte !!!

uaip

Jette un oeil ici.
J'ai appris avec ça et je n'ai jamais eu de problème.

Cordialement, uaip.
mardi 4 novembre 2008 à 22:31:37 | Re : Pb Edition de Texte !!!

racpp

Administrateur CodeS-SourceS
Salut,
Il parait que tu en Unicode. Dans ce cas GetWindowTextLength() te retournera le nombre de caractères de l'Edit. Or, le buffer retourné par le message EM_GETHANDLE est deux fois plus grand car chaque caractère en Unicode occupe deux octets. WriteFile() sauvera donc seule la première moitié du buffer. Pour que to Edit ne soit pas Unicode, crée le avec CreateWindowExA(). Bien noter le A à la fin du nom de la fonction.
mercredi 5 novembre 2008 à 02:08:13 | Re : Pb Edition de Texte !!!

julienbj

Tu peux aussi sauvegarder ton message en unicode dans le fichier.
Auquel cas, tu n'as qu'à faire FileSize * sizeof(TCHAR) dans ton WriteFile. Ainsi, sera bon si tu compiles en Unicode ou en ASCII.

--
Vive le C
Savon
mercredi 5 novembre 2008 à 03:36:34 | Re : Pb Edition de Texte !!!

racpp

Administrateur CodeS-SourceS
julienbj >> Oui mais de cette façon son fichier ne sera pas vraiment Unicode car le premier caractère ne doit pas être à la 1ère position mais plutôt à la 3ème. Les deux premiers octets d'un fichier texte Unicode sont 0xFF et 0xFE qu'il faudra mettre avant d'ajouter le texte.
mercredi 5 novembre 2008 à 10:04:47 | Re : Pb Edition de Texte !!!

ElectricalMan

super les mecs, merci ça marche nickel :)

racpp >> je m'en doutais bien que ça clochait qq part à cause de l'UNICODE

julienbj >>  ça marche bien aussi ta solution, même si, comme disait  "racpp", pour respecter la norme Unicode il faut rajouter le marqueur de l'ordre du flux. C'est le BOM (Byte Order Mark) qui vaut 0xFEFF et sera représenté 0xFF 0xFE sur une machine little endian Windows et 0xFE 0xFF sur les machines big endian. Ce marqueur est indispensable pour qu'un fichier texte soit vu comme fichier Unicode, même si ça marche sans chez moi ! ça doit permettre donc de décoder correctement les caractères Unicode. Donc au niveau de mon code :
   ...
   #ifdef UNICODE
   WCHAR BOM = 0xFEFF ;
   WriteFile(hFile, &BOM, sizeof(BOM), &nbcharRead, NULL) ;
   WriteFile(hFile, hBuffer, FileSize * sizeof(TCHAR), &nbcharRead, NULL) ;
   #endif
   ...


Une question : qu'est ce qui est plus interresant AINSI ou UNICODE ?
mercredi 5 novembre 2008 à 11:01:03 | Re : Pb Edition de Texte !!!

ElectricalMan

ou bien faudrait il mettre de la compilation conditionnelle partout pour avoir qq chose de générique ?
mercredi 5 novembre 2008 à 18:37:20 | Re : Pb Edition de Texte !!!

racpp

Administrateur CodeS-SourceS
Puisque c'est pendant l'exécution que ça se passe, et non pas à la compilation, je pense qu'il est préférable d'utiliser IsWindowUnicode() pour déterminer si le controle est Unicode ou non.
L'intérêt de l'Unicode réside dans le support multilingue. En effet, il permet aux applications de pouvoir utiliser toutes les langues de la planète. Son inconvénient est d'occuper deux fois plus d'espace, disque ou mémoire, que l'ANSI. N'utiliser Unicode donc que quand c'est indispensable.

mercredi 5 novembre 2008 à 20:11:38 | Re : Pb Edition de Texte !!!

julienbj

Pour l'écriture en Unicode, je suis d'accord sur le principe, il faut mettre un BOM si le fichier doit être partagé par différentes applis, entre différents utilisateurs, ...
Si il s'agit d'un fichier de config propre à une appli, pourquoi mettre le BOM? Plus compliquer à écrire et à relire...

racpp >> Qu'est-ce qui permettra de choisir entre réaliser une appli en UNICODE ou en ANSI? Les performances sont-elles les mêmes?

--
Vive le C
Savon
mercredi 5 novembre 2008 à 23:25:06 | Re : Pb Edition de Texte !!!

racpp

Administrateur CodeS-SourceS
julienbj >> Personnelement je n'utilise Unicode que pour les applications multilingues. Surtout quand il s'agit de langues totalement différentes. Pour les performances, Unicode serait préférable dans certains cas. Les systèmes NT étant essentiellement Unicode il est plus direct d'appeler les versions Unicode des fonctions au lieu des versions ANSI puisque ces dernières ne font que traduire en Unicode les chaines passées en paramètres avant de les rediriger vers les premières. Cette traduction et cette redirection coûtent beaucoup de cycles au processeur surtout quand c'est répétitif.



Cette discussion est classée dans : ofn, hfile, szfile, hbuffer, nbcharread


Répondre à ce message

Sujets en rapport avec ce message

[API WIN32] Problème d'écriture dans un fichier [ par elchevive ] Salut à tous, j'ai un petit problème avec une fonction qui est censée écrire dans un fichier le contenu de l'edit d'une fenêtre MDI. Il créer le fich Problemes pour formatter le nom de mes fichiers a ouvrir [ par pif56 ] Bonjour,Voila j aimerais pouvoir, au sein d une boucle while, ouvrir une famillede fichiers textes appeles "i.txt" oú i est un entier parcourant [0,4] ouvrir une image [ par doudouhic ] Bonjour, J'essaye de charger une image à partir du disque dure en utilisant les MFC. j'utilise le code suivant: OPENFILENAME ofn; // common dialog box GetOpenFileName [ par piroman14 ] Salut!j'ai un problème avec GetOpenFileNamej'en utilise deux et je n'arrive pas à faire fonctionner le premier des deux je crois qu'il faut utiliser u WriteFile => caractères non reconnu dans le fichier [ par Flo1987 ] Bonjour,J'ai un problème avec la fonction WriteFile : je cherche à écrire un tableau de double dans un fichier mais je retrouve des caractères non rec (win32)Fichier et buffer en lecture seule [ par mogwai93 ] Bonjour Je voudrais lire un fichier, placer le contenu de ce fichier dans un buffer et modifier ce buffer (mais pas le fichier). J'arrive bien à ou COPIE DE FICHIER SANS INDIQUER LE CHEMIN COMPLET [ par Batman60 ] Bonjourje voudrais copier et renommer un fichier vers un dossier sans indiquer le chemin complet pour pouvoir placer le dit dossier n'importe où sur l probleme dans la lecture d'un fichier [ par jack_ryan ] bonjour,voila je cherche a ouvrir un fichier bmp et mon code ne semble pas avoir accés a tout le fichier je m'en remet a vous pour savoir si cela est probleme avec wininet [ par cbarcli ] voila je veux compiler le code si dessous sous dev-c++ mais ça donne des erreur du genre:   [Linker error] undefined reference to `InternetOpenA@20' ecriture saut de ligne dans un fichier [ par mogwai93 ] j'essaie d'ecrire un saut de ligne dans un fichier sauf qu'il ne m'ecrit que 0A au lieu de 0D 0A comment corriger ? merci     hFile = CreateFile(Mon_


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,281 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales