Supprimer une ligne dans un fichier texte

grod0026 Messages postés 139 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 5 décembre 2020 - 20 janv. 2010 à 22:18
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 22 janv. 2010 à 14:19
bonsoir
voila j essaye de supprimer une ligne dans un fichier texte,
Donc j'ouvre mon fichier original et le temporaire.
si l'enregistrement est égal a la recherche je n'écrit pas les données.

mon problème, c est que le temporaire est exactement identique a l original
je post juste le code pour savoir comment c'est possible et quelle erreur je fais.
	if Narech2<>0 then // on a choisi un item
begin
// regarde dans tout le fichier
If FileExists('c:\CB1Cb.txt') then
begin
AssignFile(FtempBox,'c:\CB1Cbtmp.txt');
rewrite(FtempBox);
AssignFile(Flistbox,'c:\CB1Cb.txt');
Reset(Flistbox);
i:=1;
while not eof(Flistbox) do
begin
if i<>Narech2 then
begin
for j :=1 to 5 do
begin
readln(FlistBox,TextaLire);
writeln(FtempBox,TextaLire);
end;
end;
inc(i);
end;
closefile(Flistbox);
closeFile(ftempbox);
end;
end;

bien entendu j ai suivi la procédure pas a pas, les valeurs Nrech2 et i sont bonne (et de type integer)

La structure de mon fichier texte cb1cb.txt est
1
service 1
1
0
0
2
batiment A
2
1
0
etc...
j ai trouve une solution en passant par tstringlist
je cree une liste contenant :
1@service 1@1@0@0@
2batiment A@2@1@0@
etc
je supprime par delete, puis je redécouperais et enregistrerais.
cependant je ne comprend pas pourquoi cela ne marche pas
merci de votre aide
a+

3 réponses

Utilisateur anonyme
21 janv. 2010 à 09:15
Salut,

C'est tout à fait normal que cela ne fonctionne pas .

D'après l'aide (Touche F1 ) : La procédure Readln lit une ligne de texte, puis saute à la ligne suivante du fichier.

Voila une procedure pour supprimer une ligne en fonction de son indice

Procedure DeleteItem(AnItemIndex:Byte);
Var
  fTempFile,fFile:TextFile;
  i:Byte;
  Str:String;
Begin
  If AnItemIndex<>0 then
    Begin
      If FileExists('c:\Test.txt') then
Begin
  AssignFile(FTempFile,'c:\TestTemp.txt');
  AssignFile(FFile,'c:\Test.txt');
  rewrite(FTempFile);
  Reset(FFile);
          i:=0;
          Repeat
            ReadLn(fFile,Str);
            If i<>AnItemIndex Then
            WriteLn(fTempFile,Str);
            Inc(i);
          Until EOF(fFile);
  closefile(FFile);
  closeFile(FTempFile);
End;
    End;
End;


A appeler ainsi :

procedure TForm1.Button1Click(Sender: TObject);
begin
  DeleteItem(5);
end;


Attention à différentes choses :

1)Quant tu donnes un code pense aussi à nous définir les variables (Car une erreur peut aussi venir de là).

2)Quant tu nommes des variables, il faut faire attention : je pense à FtempBox et fListBox. Dans la mesure ou il s'agit d'une variable fichier, il faut mieux éviter d'utiliser le suffixe Box dans la déclaration de tes variables (Box renvoyant à des composants de la VCL comme TScrollBox, TListBox ect ect et évidemment un TListBox n'est pas une variable de type fichier).

3)Attention à l'indentation

4)Evite d'utiliser les variables fichiers alors qu'il existe des outils bien plus performants : (les culottes de grand-mère s'est plus d'actualité ).
0
grod0026 Messages postés 139 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 5 décembre 2020
21 janv. 2010 à 21:09
bonsoir,
tout d abord merci pour tes remarques, j en tiendrais compte,
1 et 2) rien a redire
3) l indentation chez moi était bonne je te met l'indentation de chez moi. Comme je met des tabulation, c est surement la le problème
(correction, je copie et je corrige l'indentation comme chez moi)
begin
  for j:=1 to 5 do
    begin
      readln(Ffile,TextaLire);
      if i<>Narech2 then writeln(FTempfile,TextaLire);
    end;
  inc(i);
end;

mais bon c est pas grave.

4 pour les 'vielles culottes de grand-mère...
tout a fait d accord avec toi,je connais aussi les fichiers a accès direct
(type record) et moins bien les fichiers non typés.
cependant l'avantage (pour moi) était simplement de pouvoir modifier le fichier cb1.txt directement et d'avoir un affichage 'en clair'.

en conclusion, je te remercie encore de ta réponse, je mélangeais deux méthodes (accès séquentiel et fichier texte), alors que je ne déplaçais pas l'enregistrement (!!!!);

a bientôt
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
22 janv. 2010 à 14:19
salut,
pour travailler sur les fichiers textes il vaut mieux les charger dans un TString.


Procedure DeleteItem(AnItemIndex:Byte;FileName:String);
Var
LISTE:TString;
Begin
If AnItemIndex<>0 then
Begin
If FileExists('c:\Test.txt') then
Begin
LISTE:=TStringList.Create;
LISTE.LoadFromFile(FileName);
LISTE.Delete(AnItemIndex);
LISTE.SaveToFile(FileName);
LISTE.Free;
End;
End;
End;

@+
JLEN
0