Ecrire dans un fichier texte à un endroit précis [Résolu]

Signaler
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
-
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
-
Bonjour,



J'ai un fichier texte qui à 34 lignes



je souhaites en réécrire un nouveau



qui remplace à partire du caractère 22 de la ligne 8

10 caractères



J'ai donc écrit ce bout de code



program Facture;



{$APPTYPE CONSOLE}



uses

SysUtils,

strUtils;



var

R,lig,ligne,N_Facture,Agence: string;

i: integer;

F,nouveau: textfile;



begin



assign(nouveau,'c:\master\sernam2.tto') ;

rewrite(nouveau);

append(nouveau);





Write ('entrer un N° de Facture :');

readln(N_Facture);

// lecture du fichier

assign(F,'C:\MASTER\facture.tto');



reset(F);

//while not eof(F)



for i:= 1 to 34

do begin

// lecture de la ligne





readln (F,ligne);

lig:=ligne;

writeln(nouveau,lig);



IF i = 8 then

begin

R:=StuffString(lig,23,10,N_Facture);

writeln(nouveau,R);

end



else

readln (F,ligne);

lig:=ligne;

writeln(nouveau,lig);

end;









for i:= 1 to 10000

do

begin

writeln (lig)

end ;

closefile(nouveau);



end.



Le problème et je pense qu'il est minime mais je n'ariive pas à voir,



c'est que cela me réécrit ma ligne 8 et me rajoute mes changements en ligne 9



Merci d'avance de votre aide.



couf

5 réponses

Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
par contre pouquoi

for i:= 1 to 10000

do

begin

writeln (lig)

end ;

?

ainsi tu ajoutes 10000 fois la derniere ligne lig

maintenenant si tu avais indenté ton code tu aurais vu:

for i: = 1 to 34 do

begin

// lecture de la ligne

readln (F,ligne);

lig:= ligne;

writeln(nouveau,lig); // là tu écris immédiatement la ligne non modifiée

if i = 8 then

begin

R:= StuffString(lig,23,10,N_Facture);

writeln(nouveau,R);

end else readln (F,ligne);

lig: =ligne;


writeln(nouveau,lig);//là tu forces l'écriture de la ligne non modifiée


end;

dans tous les cas tu écris 2 fois ta ligne.

il aurait fallu écrire:

i:= 1


while not EOF(F) do // pour être sur d'atteintre la fin du fichier


begin


// lecture de la ligne

readln (F,ligne);


IF i = 8 then


begin


R:=StuffString(ligne,23,10,N_Facture);


writeln(nouveau,R);


end else

begin

writeln(nouveau,ligne);

end;

inc(i);// on incremente le pointeur


end;
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
salut,

il serait plus de passer par un Tstrng.

var

TempList: TStrings;

R,lig,ligne,N_Facture,Agence: string;

begin

TempList := TStringList.Create; //creation d'une liste provisoire

try
TempList.LoadFromFile('C:\MASTER\facture.tto');//lecture du fichier

lig: =TempList[8];.

TempList[8]:=StuffString(lig,23,10,N_Facture);//modification de la ligne

TempList.SaveToFile('c:\master\sernam2.tto');//enregistrement dans nouveau

finally TempList.Free; end;//liberation memoire

end;

bonne prog
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
1
Merci Beaucoup,



hier un de mes collègues m'a traité de jeune PADAWAN (cf guerre des étoiles)

Je comprends maintenant pourquoi.

Merci encore

couf
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
12
entre les 2 solutions que je t'ai donné la 1ere donne un code plus propre.

Maintenant c'est en se forgeant sa propre expérience que l'on apprend!!
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Bah, et encore, jeune Padawan, ca va, c'est pas trop la casse.... T'as jamais eu droit à " héhé, pas encore au point, petit scarabé..."

Flute, je viens de me surprendre a penser qu'en cobol c'est infiniment plus simple, abattez-moi !

gnh !