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

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 : 11 229

Note :
Aucune note

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 :)

Commentaires et avis

signaler à un administrateur
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 ?

signaler à un administrateur
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

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de buno le 08/09/2005 11:59:54

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

signaler à un administrateur
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.

signaler à un administrateur
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 récupération d'un fichier dans un tableau [ par dgac ] Bonjour j'ai essayé le code suivant[CODE] #include&lt 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é &lt; 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


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,733 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.