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;
}
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.