Accueil > > > SUPPRIMER UNE CHAINE DE CARACTERES D'UN FICHIER
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
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
aide traitement du fichier [ par boualiasma ]
J'ai un fichier qui se compose de deux champs : - numero présenté par un entier - attribut présenté par une chaine caractère. On a la même taille po
f.open() avec string [ par Yannick465 ]
Bonjour, comment peut-on utiliser la commande f.open() pour ouvrir un fichier dont le nom a été spécifié par l'utilisateur avec la commande cin >&g
comment recherecher un mot dans une chaine de caractères ?? [ par yosboss ]
Salut à tous,je sollicite votre aide pour rechercher un mot dans un ensemble de chaine de caractère contenu dans un ficher !
traitement d'un fichier [ par boualiasma ]
Salut,J'ai un fichier texte bien formé contient deux champs: objet et attribut.tous les objets sont des entiers et tous les attributs sont de chaines
string to bstr [ par wislam2007 ]
Salut je veux marshaler un bstr pr un prg ecrit en NCl. j'ai besoin de convertir ma chaine en BSTR. j'ai tenté par : [code=cpp]unsigned long length =
|
Derniers Blogs
L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson
Forum
TRADAIONTRADAION par shootangel
Cliquez pour lire la suite par shootangel
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|