begin process at 2010 03 21 07:13:03
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > SUPPRIMER UNE CHAINE DE CARACTERES D'UN FICHIER

SUPPRIMER UNE CHAINE DE CARACTERES D'UN FICHIER


 Information sur la source

Note :
Aucune note
Catégorie :Fichiers / Disque Classé sous :supprimer, chaine, caractères, fichier, string Niveau :Débutant Date de création :07/09/2005 Date de mise à jour :08/09/2005 17:28:17 Vu :12 890

Auteur : buno

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


 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

Source avec Zip DÉTECTION DE LANCEMENT D'APPLICATION (WIN32, REGISTERSHELLHO...
RÉCUPÉRATION DE L'URL COURANTE DANS INTERNET EXPLORER
Source avec Zip Source avec une capture IMPLÉMENTATION DE LA GESTION STANDARD DES CHAINES DE CARACTÈ...
Source avec Zip PRÉSENTATION DE DOXYGEN
Source avec Zip LOADER BMP + TRAITEMENT

 Sources de la même categorie

Source avec Zip EDITER UN FICHIER BIT PAR BIT par riton91
Source avec Zip Source avec une capture ID3 TAG COVER ALBUM IMAGE par nanonavich
FILEREADER par FrancoisGauthier
Source avec Zip CLASSE AVANCÉE DE LOG, THREAD SAFE ET DIVERSES SURCHARGES par sboli
Source avec Zip Source avec une capture Source .NET (Dotnet) INFILESEEKER par swonder

 Sources en rapport avec celle ci

Source avec Zip GSTRING - GESTION DES CHAINES DE CARACTÈRES par Neokript
Source avec Zip MYSTRING, CLASSE TRAITANT DES CHAÎNES DE CARACTÈRES par Noubzor
Source avec Zip Source avec une capture [C/WIN32] GÉNÉRATEUR DE CODE POUR UNE INITIALISATION SPÉCIAL... par deck_bsd
Source avec Zip CRÉATION D'UNE CLASSE CL_STRING (GESTION DES CHAÎNES) par UKR6900
Source avec Zip SUPPRIME CHAINE DANS FICHIER (WIN32) par BruNews

Commentaires et avis

Commentaire de BruNews le 07/09/2005 19:11:07 administrateur CS

C'est pour montrer au débutant ce qu'il ne faut pas faire que tu nous poses cela ?

Commentaire de Sizlaa le 07/09/2005 20:11:25

Mwouai, tu n'étais pas obliger de créer une new source pour ça, car c'est un peu basique pour être postée...
Bref @+
et bonne continuation

Commentaire de buno le 07/09/2005 20:18:29

BruNews> bah...euh...c'est un premier jet :) en réponse à une question du forum

Sizlaa> Basique?! Mouais... pourquoi autant de questions sur le sujet alors?

J'en prend note, je vous remercie, et je vais donc chercher une autre façon de faire

Commentaire de BruNews le 07/09/2005 20:21:09 administrateur CS

C'est surtout la méthode qu'il ne faut pas suivre.
Une ligne peut faire nimporte quelle taille.
La lecture ligne à ligne est une cata en performance, on boucle sur un buffer (32 Ko au moins) et on ballade 2 pointeurs dedans pour trouver la chaine.
Si le fichier est gros, on aura une erreur mémoire avant la fin.
Bref, à refaire complet.

Commentaire de BruNews le 07/09/2005 20:24:56 administrateur CS

BUNO > regarde ici comment trouver une chaine et boucler sur le buffer:
TROUVER UNE CHAINE DE CARACTÈRES(2) (WIN32)
http://www.cppfrance.com/code.aspx?id=19169

t'auras plus que la recopie à mettre, no prob car tu ne peux qu'enlever des octets donc tu peux réécrire direct dans le fichier sans risque d'écrasement.

Commentaire de buno le 07/09/2005 20:42:34

Ok, merci de ta soluce.
Mais, entre nous, un débutant (qui ne prend pas en compte la performance de son code) préférera, non pas ma version, mais un code équivalent je pense. Mais ceci est personnel :)

@+ et merci de tes conseils

Commentaire de ymca2003 le 08/09/2005 09:38:20

Allocation : malloc
Libération : delete
=> pas bon. Il ne faut pas mixer (surtout si c'est du C car delete c'est C++).
malloc et free n'aiment pas faire de l'échangisme avec new et delete.

Commentaire de buno le 08/09/2005 11:59:54

Je pense que vous me comprendrez si je ne fais pas de mise à jour :)

Commentaire de BruNews le 08/09/2005 12:14:21 administrateur CS

ah non ? pourtant avec un cours d'"échangisme" de ymca2003 (on ne se demande plus ce qu'il a fait de ses vacances...) en plus, ça pourrait donner du pas ordinaire.

Commentaire de waynes6938 le 30/04/2007 12:07:26

Juste un petit message pour dire que c'est pas la peine de demonter ceux qui propose des choses meme basique , car il faut bien commencer un jour et c'est justement en aidant les autres que l'on apprend aussi l'humilité....
Merci Bruno c'est super sympa..

 Ajouter un commentaire


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 &lt;&lt; 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&#232;res dans un fichier, il prend le d&#233;but de cette chaine jusqu'&#224; 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 &gt;&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 =


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

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,998 sec (4)

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