Supprimer une chaine de caracteres d'un fichier

Contenu du snippet

En réponse à de nombreuses questions, voici un code qui supprime une ligne dans un fichier.
Ce code crée un fichier temporaire et le supprime en sortie du programme.

#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 applicationn"); 
   printf("Exemble: exe test.txt coucou2n"); 
   system("pause"); 
   return -1; 
 } 
 
  // Appel à la fonction 
  DWORD result=deleteStringInFile(argv[1],argv[2]); 
  printf("%sn", (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;
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.