|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
SUPPRIMER UNE CHAINE DE CARACTERES D'UN FICHIER
Information sur la source
Description
En réponse à de nombreuses questions, voici un code qui supprime une ligne dans un fichier.
Source
- #include <stdio.h>
- #include <windows.h>
-
-
- // Taille du buffer de lecture
- #define ONEMEGA 0x100000
-
- //Permet de supprimer la chaine String du fichier FileName
- DWORD deleteStringInFile(char *FileName, char *String);
-
- int main(int argc,char ** argv)
- {
- // Test des paramètres
- if (argc!=3)
- {
- printf("Problem when calling the application\n");
- printf("Exemble: exe test.txt coucou2\n");
- system("pause");
- return -1;
- }
-
- // Appel à la fonction
- DWORD result=deleteStringInFile(argv[1],argv[2]);
- printf("%s\n", (result==0) ? "pas trouvé" : "trouvé");
- system("pause");
-
- return 0;
- }
-
-
-
- DWORD deleteStringInFile(char *FileName, char *String)
- {
- char *buffer; // Buffer de lecture
- char *c, *pout; // Délimiteurs
- unsigned int i,lenfind=strlen(String);
- DWORD dwread,dwritten,bfound=0;
-
- // Ouverture d'un fichier temporaire
- HANDLE htemp = CreateFile("temp.txt",GENERIC_WRITE,0,0,CREATE_NEW,FILE_FLAG_SEQUENTIAL_SCAN,0);
- if (htemp==INVALID_HANDLE_VALUE)
- return 0;
-
- // Ouverture du fichier en mode lecture
- HANDLE hfile = CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
- if(hfile==INVALID_HANDLE_VALUE)
- return 0;
-
- // Allocation du buffer dans le tas
- // sinon, stack overflow surement
- buffer=(char *)HeapAlloc(GetProcessHeap(), 0, ONEMEGA);
-
- fromFL:
- // Remplissage du buffer
- dwread=0;
- ReadFile(hfile,buffer,ONEMEGA,&dwread,0);
-
- if (bfound)
- {
- // Si la chaine a été trouvée, on se contente d'écrire
- // et on quitte si on a lu moins d'un Mo
- WriteFile(htemp,buffer,dwread,&dwritten,0);
- if (dwread!=ONEMEGA)
- goto closeFL;
- else
- goto fromFL;
- }
-
- // Si le nombre de caractères lus < taille de String alors exit
- if(dwread<lenfind)
- goto closeFL;
-
- // Init des délimiteurs
- pout=buffer+dwread-lenfind;
- c=buffer;
-
- firstcar: // test du 1er caractère
- while(*c!=String[0])
- {
- // Test s'il reste assez de caractères
- if(++c>=pout)
- {
- if(dwread!=ONEMEGA)
- goto closeFL;
- WriteFile(htemp,buffer,dwread,&dwritten,0);
- goto fromFL;
- }
- }
- for(i=1; i<lenfind; i++)
- {
- if(c[i]!=String[i])
- goto notfound;
- }
-
- // OK! Chaine trouvée!
- bfound=1;
- WriteFile(htemp,buffer,c-buffer,&dwritten,0);
- WriteFile(htemp,c+lenfind,pout-c,&dwritten,0);
- goto fromFL;
-
- notfound:
- // KO, pas trouvée :(
- // s'il reste assez de caractères, on continue avec le même buffer
- if(++c<pout)
- goto firstcar;
-
- if(dwread==ONEMEGA)
- {
- // sinon, lecture d'un nouveau buffer
- WriteFile(htemp,buffer,dwread,&dwritten,0);
- goto fromFL;
- }
-
- closeFL:
- // Fermeture des fichiers
- CloseHandle(hfile);
- CloseHandle(htemp);
-
- // Si la chaine a été trouvée, on ré-écrit le fichier
- if (bfound)
- CopyFile("temp.txt",FileName,false);
-
- // Destruction du fichier temporaire
- DeleteFile("temp.txt");
-
- // Désallocation du buffer
- HeapFree(GetProcessHeap(),0,buffer);
-
- // Fin
- return bfound;
- }
#include <stdio.h>
#include <windows.h>
// Taille du buffer de lecture
#define ONEMEGA 0x100000
//Permet de supprimer la chaine String du fichier FileName
DWORD deleteStringInFile(char *FileName, char *String);
int main(int argc,char ** argv)
{
// Test des paramètres
if (argc!=3)
{
printf("Problem when calling the application\n");
printf("Exemble: exe test.txt coucou2\n");
system("pause");
return -1;
}
// Appel à la fonction
DWORD result=deleteStringInFile(argv[1],argv[2]);
printf("%s\n", (result==0) ? "pas trouvé" : "trouvé");
system("pause");
return 0;
}
DWORD deleteStringInFile(char *FileName, char *String)
{
char *buffer; // Buffer de lecture
char *c, *pout; // Délimiteurs
unsigned int i,lenfind=strlen(String);
DWORD dwread,dwritten,bfound=0;
// Ouverture d'un fichier temporaire
HANDLE htemp = CreateFile("temp.txt",GENERIC_WRITE,0,0,CREATE_NEW,FILE_FLAG_SEQUENTIAL_SCAN,0);
if (htemp==INVALID_HANDLE_VALUE)
return 0;
// Ouverture du fichier en mode lecture
HANDLE hfile = CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
if(hfile==INVALID_HANDLE_VALUE)
return 0;
// Allocation du buffer dans le tas
// sinon, stack overflow surement
buffer=(char *)HeapAlloc(GetProcessHeap(), 0, ONEMEGA);
fromFL:
// Remplissage du buffer
dwread=0;
ReadFile(hfile,buffer,ONEMEGA,&dwread,0);
if (bfound)
{
// Si la chaine a été trouvée, on se contente d'écrire
// et on quitte si on a lu moins d'un Mo
WriteFile(htemp,buffer,dwread,&dwritten,0);
if (dwread!=ONEMEGA)
goto closeFL;
else
goto fromFL;
}
// Si le nombre de caractères lus < taille de String alors exit
if(dwread<lenfind)
goto closeFL;
// Init des délimiteurs
pout=buffer+dwread-lenfind;
c=buffer;
firstcar: // test du 1er caractère
while(*c!=String[0])
{
// Test s'il reste assez de caractères
if(++c>=pout)
{
if(dwread!=ONEMEGA)
goto closeFL;
WriteFile(htemp,buffer,dwread,&dwritten,0);
goto fromFL;
}
}
for(i=1; i<lenfind; i++)
{
if(c[i]!=String[i])
goto notfound;
}
// OK! Chaine trouvée!
bfound=1;
WriteFile(htemp,buffer,c-buffer,&dwritten,0);
WriteFile(htemp,c+lenfind,pout-c,&dwritten,0);
goto fromFL;
notfound:
// KO, pas trouvée :(
// s'il reste assez de caractères, on continue avec le même buffer
if(++c<pout)
goto firstcar;
if(dwread==ONEMEGA)
{
// sinon, lecture d'un nouveau buffer
WriteFile(htemp,buffer,dwread,&dwritten,0);
goto fromFL;
}
closeFL:
// Fermeture des fichiers
CloseHandle(hfile);
CloseHandle(htemp);
// Si la chaine a été trouvée, on ré-écrit le fichier
if (bfound)
CopyFile("temp.txt",FileName,false);
// Destruction du fichier temporaire
DeleteFile("temp.txt");
// Désallocation du buffer
HeapFree(GetProcessHeap(),0,buffer);
// Fin
return bfound;
}
Conclusion
Merci à BruNews qui a fourni l'ossature de la fonction. Ce code crée un fichier temporaire et le supprime en sortie du programme.
Historique
- 08 septembre 2005 14:55:01 :
- Correction du bug "Allocation/Désallocation"
- 08 septembre 2005 17:28:17 :
- On efface tous en on recommence...en prenant en compte les différents commentaires :)
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Urgent:supprimer une chaine d'un fichier [ par rene77 ]
Bonjour à tous, J'ai besoin de supprimer des chaines de caractères d'un fichier txt.Je travaille sous Builder et j'y arrive pas !!!OUINNNN OUINNNS'il
chaine de caractères et fichier [ par wanny ]
Bonjour.Je voudrais savoir comment faire pour supprimer une chaine de caractères spécifiques dans un fichier texte...Merci d'avance.wanny
Récupérer une chaine dans un fichier texte [ par alncool ]
En fait je dispose d'une classe avec trois attributs de type string. J'ai réalisé une surcharge de l'opérateur << pour pouvoir écrire dans un fi
recherche une chaine de caractères dans un fichier [ par Tamahoma ]
Bonjour, Je voudrais rechercher une chaine de caractères dans un fichier, il prend le début de cette chaine jusqu'à ce qu'il rencontre
chaine de caractères et expressions régulières [ par Neufran ]
Bonjour à tous,Voilà mon problème : Admettons que j'ai une chaine de caractères. Dans celle-ci il y a le nom d'un fichier et son extension séparés par
récupération d'un fichier dans un tableau [ par dgac ]
Bonjour j'ai essayé le code suivant[CODE] #include<
Ouvrir un fichier contenant une chaine d'entier [ par Jedi_Yoda ]
Bonjour,Je cherche a modifier ce code de facon a l'adapter a une chaine d'entiers et non de caracteres:char chaine[120];ifstream f("dossier.txt");f.ge
Liste de combinaisons [ par simtiers ]
Salut !Voilà, ce code compile parfaitement, je le pense correct, mais dès la première execution, il me plante méchamment dans les mains : ACCESS VIOLA
Problème dans l'enregistrement d'un fichier après simple cryptage xor. [ par Sim 2005 ]
Bonjour,J'ai réalisé un programme juste pour voir comment fonctionnait le cryptage xor. Il demande un fichier source, le fichier dest et une clé <
ouvrire polusieurs fichiers [ par Stiko ]
bonjour; je veux ouvrire plusieurs fichiers "toto1.txt","toto2.txt".."toto10.txt"pourcela j ai fait un tableau de string tab1[];et j ai essayé de met
|
Téléchargements
Logiciels à télécharger sur le même thème :
|