podone POD first ONE of best game Profil : Habitué | Hansdadou a écrit :
Bonjour,
Je recherche un "bout de code" qui permet d'ouvrir un fichier texte et de remplacer certains caractères par d'autres.
N'étant pas développeur, je me permets de poser la question sur le forum.
D'avance merci.
|
Voici une solution possible :
Code :
- // CHGTXT.cpp : définit le point d'entrée pour l'application console.
- //
- #include "stdafx.h"
- #include <windows.h>
- // Taille du buffer tampon de fichier
- #define FILEBUFFERSIZE (1024)
- // Fonction de modification de fichier
- bool FileModify(char* A_lpszFileName, // IN
- char* A_lpszStringToReplace, // IN
- char* A_lpszNewString); // IN
- int _tmain(int argc, _TCHAR* argv[])
- {
- FileModify("chgtxt.txt",
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~#{[|`@]}¤&é'(-è_çà)=^$ù*<,;:!1234567890°+£%µ>?./§",
- "zyxwvutsrqponmlkjihgfedcba§/.?>µ%£+°0987654321!:;,<*ù$^=)àç_è-('é&¤}]@`|[{#~ZYXWVUTSRQPONMLKJIHGFEDCBA" );
- return 0;
- }
- bool FileModify(char* A_lpszFileName, // IN
- char* A_lpszStringToReplace, // IN
- char* A_lpszNewString) // IN
- {
- // Resultat de la fonction
- bool bResultat;
- // Handle du fichier texte
- HANDLE hFile;
- // Buffer tampon du fichier
- char* lpszFileBuffer;
- // Caractere trouve
- char szCharFound[2];
-
- // Nombre de caracteres lus dans le fichier
- DWORD dwNbOfBytesRead;
- // Nombre de caracteres ecrits dans le fichier
- DWORD dwNbOfBytesWritten;
- // Offset de recherche
- DWORD dwOffset;
- // Offset de resultat de recherche
- DWORD dwFoundPosition;
- // Initialiser le resultat
- bResultat = false;
- // SI chaines de tailles differentes
- if (strlen(A_lpszStringToReplace) != strlen(A_lpszNewString))
- {
- // Aller a FunctionRet
- goto FunctionRet;
- }
- // FIN SI
- // Creer le buffer tampon
- lpszFileBuffer = (char*) malloc(FILEBUFFERSIZE + 1);
- // Ouvrir le fichier texte
- hFile = CreateFile(A_lpszFileName,
- (GENERIC_READ | GENERIC_WRITE),
- 0,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
-
- // SI l'ouverture a echoue
- if (hFile == INVALID_HANDLE_VALUE)
- {
- // Aller a FunctionEnd
- goto FunctionEnd;
- }
- // FIN SI l'ouverture a echoue
- // SI on ne peut pas se positionner en debut du fichier
- if (SetFilePointer(hFile, 0L, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
- {
- // Aller a CloseFile
- goto CloseFile;
- }
- // FIN SI on ne peut pas se positionner en debut du fichier
- // Initialiser le caractere trouve
- szCharFound[1] = 0;
-
- // FAIRE
- do
- {
- // SI la lecture d'une portion du fichier a echoue
- if (!(ReadFile(hFile, lpszFileBuffer, FILEBUFFERSIZE, &dwNbOfBytesRead, NULL)))
- {
- // Aller a CloseFile
- goto CloseFile;
- }
- // FIN SI la lecture d'une portion du fichier dictionnaire a echoue
-
- // Transformer le buffer lu en chaine
- *(lpszFileBuffer + dwNbOfBytesRead) = 0;
- // Initialiser l'offset
- dwOffset = 0;
- // TOUJOURS
- while (TRUE)
- {
- // Rechercher si caractere a remplacer
- dwFoundPosition = (DWORD)strcspn((lpszFileBuffer + dwOffset), A_lpszStringToReplace);
-
- // SI pas de caractere trouve
- if (dwFoundPosition == strlen(lpszFileBuffer + dwOffset))
- {
- // Continuer au bloc suivant
- break;
- }
- // FIN SI
- // Position reelle
- dwFoundPosition += dwOffset;
- // Recuperer le caractere trouve
- szCharFound[0] = *(lpszFileBuffer + dwFoundPosition);
- // Recuperer l'offset du caractere dans la chaine a modifier
- dwOffset = (DWORD)strcspn(A_lpszStringToReplace, szCharFound);
- // Remplacer le caractere trouve
- *(lpszFileBuffer + dwFoundPosition) = *(A_lpszNewString + dwOffset);
- // Initialiser l'offset de recherche
- dwOffset = dwFoundPosition + 1;
- }
- // FIN TANT QUE
- // SI echec du repositionnement du pointeur de fichier
- if (SetFilePointer(hFile, -(int)dwNbOfBytesRead, NULL, FILE_CURRENT) == INVALID_SET_FILE_POINTER)
- {
- // Aller a CloseFile
- goto CloseFile;
- }
- // FIN SI on ne peut pas se repositionner
- // SI echec de la reecriture du fichier
- if (!(WriteFile(hFile, lpszFileBuffer, dwNbOfBytesRead, &dwNbOfBytesWritten, NULL)))
- {
- // Aller a CloseFile
- goto CloseFile;
- }
- // FIN SI echec de la reecriture du fichier
- // SI ecriture incomplete
- if (dwNbOfBytesRead != dwNbOfBytesWritten)
- {
- // Aller a CloseFile
- goto CloseFile;
- }
- // FIN SI ecriture incomplete
- }
- // TANT QUE le fichier n'est pas lu completement
- while (dwNbOfBytesRead == FILEBUFFERSIZE);
- // Indiquer reussite
- bResultat = true;
- CloseFile:
- // Fermer le fichier
- CloseHandle(hFile);
- FunctionEnd:
- // Liberer la memoire tampon
- free(lpszFileBuffer);
- FunctionRet:
- // Retourner le resultat
- return bResultat;
- } // fin FileModify()
|
Appelée 2x, la fonction restitue au fichier son format d'origine.
Attention ! Cette solution n'est pas valide pour un fichier txt Unicode. Message édité par podone le 22-10-2004 à 23:14:41
|