fiascoco
Messages postés7Date d'inscriptionmardi 9 janvier 2007StatutMembreDernière intervention13 mars 2007
-
12 janv. 2007 à 18:26
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
17 nov. 2010 à 23:49
bonjours à tous,
voila j'aimerais ajouter et modifier contenu d'un fichier texte, alors pour cela je recupere tout les info qu'il y a dessus (avec un assignfile(f,'toto.txt'); reset(f); readln(f, contenu); closefile(f);
puis j'efface le fichier et je reecrit tout avec la version modifier:
assignfile(f,'toto.txt'); rewrite(f); writeln(f,'ouaiii'+contenu+'ok'); closefile(f);
truc de base mais qui pourtout m'affiche une erreur E/S 32 en me colorant la ligne où j'ai ecrit le writeln;
j'ai verifié , tout reverifié (voir si il manque un ';' ou erreur bète du meme genre on ne sait jamais), je ne vois pas pourquoi.
Quelqu'un a t'il une solution??
rq: si je reecrit le contenu dans un fichier toto(2).txt -> plus d'erreur, allez savoir pourquoi. Je sais que il existe d'autre topics de ce type, mais ils m'aident pas plus, sauf qu'il paraiterai que ce soit un probleme que le fichier toto.txt est deja ouvert et donc ca plante.
Mais je ne vois pourquoi pourquoi ce serai ca vus que j'ai bien ecrit closefile(f);
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 13 janv. 2007 à 04:44
utilise les streams si ton fichier est assé gros (> 1Mo), sinon utilise un TStringList (< 1Mo).
de plus n'oublis pas le bloc Try Finally :
AssignFile(F, FileName);
Try
Reset(F); ou Rewrite(F);
....
Finally
CloseFile(F);
end;
avec les streams c'est assé simple :
var
TFS : TFileStream;
S : String;
P : PChar;
begin
TFS := TFileStream.Create(FileName, fmOpenRead);
Try
if TFS.Size <> 0 then begin
SetLength(S, TFS.Size);
P := PChar(S);
TFS.ReadBuffer(P^, TFS.Size);
end;
Finally
TFS.Free;
end;
if (Condition) then begin
TFS := TFileStream.Create(FileName, fmOpenWrite);
try
S := 'ouai '+S+' Ok';
P := PChar(S);
TFS.WriteBuffer(P^, Length(S));
finally
TFS.Free;
end;
end;
end;
et avec les StringList c'est encore plus simple :
var
TSL : TStringList;
S : string;
begin
TSL := TStringList.Create;
try
TSL.OpenFromFile(FileName);
if TSL.Count <> 0 then begin
S := TSL.Strings[0];
if (condition) then begin
TSL.Clear;
TSL.Add('ouai '+S+' Ok');
TSL.SaveToFile(FileName);
end;
end;
finally
TSL.Free;
end;
end;
fiascoco
Messages postés7Date d'inscriptionmardi 9 janvier 2007StatutMembreDernière intervention13 mars 2007 13 janv. 2007 à 12:06
merci beaucoup,
je ne connaissai pas du tout cette technique de tout enregistrer d'un coup dans un tableau de chaines(pour ta solution 2) , de le manipuler, ....
par contre moi, ton code ne marche que si je met LoadFromFile(FileName) à la place de OpenFromFile(...).
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 13 janv. 2007 à 23:44
{$I-} et {$I+} ne servent, respectivement, qu'à désactiver puis à activer la gestion des erreurs d'entrées sorties dans le code de l'application. Ce n'est donc pas un solution mais simplement un moyen de masquer les erreurs...
@fiascoco : ton code fonctionne parfaitement et le problème doit se situer ailleurs. Comment déclares-tu le type de fichier dans lequel tu écris ?
Es-tu sur qu'ailleurs, dans ton code, le fichier n'aurait pas déjà été ouvert ?
Le fichier toto.txt ne serait-il pas resté ouvert lors d'un plantage précédent ?
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
fiascoco
Messages postés7Date d'inscriptionmardi 9 janvier 2007StatutMembreDernière intervention13 mars 2007 14 janv. 2007 à 16:26
pour [auteurdetail.aspx?ID=3267 Delphiprog]
j'ai declarer ma variable en tant que 'textfile', et apprenant que mon erreur proviendrai du fait que mon fichier serai deja ouvert, j'ai tout de suite chercher où j'ai pus oublier de refermer le fichier, mais je n'ai pas trouvé d'endroit. Maintenant tu me dis que cela peut provenir d'un plantage precedent qui aurai pus laissé le fichier ouvert, peut etre mais si oui alors lorsque je recompile il gardera le fait que le fichier est ouvert??
bizzare bizzare
mmmh du style des que je lance mon programme , je lui dis que faire un closefile(f) au cas ou, bof quoi.
sinon pour cirec, "readln(f, contenu); ne lit que la première ligne du fichier pas la totalité" , je sais bien , c'était un exemple pour resumer en gros que je recuperai le contenu
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 14 janv. 2007 à 19:16
@fiascoco : si tu oublies de refermer ton fichier dans le code, le fait de quitter l'application ne ferme pas le fichier pour autant. C'est le système d'exploitation qui le fermera quand :
1- on le lui demandera
2- il y aura fermeture de la session
3- à l'arrêt du système
Encore une hypothèse que j'ai oublié de te demander : les ouvertures et fermetures de fichier se font-elles uniquement dans le thread principal de l'application ?
@Francky : je suis d'accord avec toi. La désactivation du contrôle d'E/S doit être accompagnée de l'interprétation de la variable IOResult. C'était ce que je voulais dire.
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 14 janv. 2007 à 20:54
Tout à fait.
J'ajouterai que, de toute manière, l'utilisation de try...except ou la
désactivation/activation de la gestion des erreurs, même avec
interprétation, n'est qu'un emplâtre sur une jambe de bois.
Quand un code plante systématiquement sur une suite d'instructions comprenant
la lecture/écriture dans un fichier, il y a intérêt à savoir pourquoi.
Sinon je ne vois pas trop à quoi, ou à qui il va pouvoir servir, ce code...
S'il est utile de protéger son code contre une erreur inattendue, il
n'est pas supportable d'écrire un code approximatif, en se croyant
quitte puisqu'il est "protégé" par un bloc de gestion des erreurs...
D'où l'intérêt de se pencher sur l'interprétation du message d'erreur retourné par Delphi, comme nous le rappelle Cirec.
ODLCITEINFO
Messages postés10Date d'inscriptionsamedi 28 janvier 2006StatutMembreDernière intervention29 décembre 2010 17 nov. 2010 à 22:46
ce topic date un peu mais si autres personnes recherche la solution au vu ce ce que tu as marqué, tu fait correctement ta lecture d'info, tu réécrit le fichier avec rewrite, mais tu as oublier avant toute écriture dans le nouveau fichier un append, important, car tu as refait le fichier mais pas ouvert, ton programme ne peut pas accéder au fichier, tu ne le lui a pas permis.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 17 nov. 2010 à 23:49
Salut,
[quote=ODLCITEINFO]mais tu as oublier avant toute écriture dans le nouveau fichier un append, important, car tu as refait le fichier mais pas ouvert, ton programme ne peut pas accéder au fichier, tu ne le lui a pas permis. /quote c'est faux !!!
Append ne sert qu'à ajouter des données au fichier ... Lis tous les messages et tu verras que l'erreur venait d'un précédent plantage du programme qui du coup ne fermait pas le fichier ... Motif ?
Fiasco n'utilisait pas de bloc try/finnaly/end
Mais quoi qu'il en soit .. AssignFile/CloseFile sont obsolètes (cf. commentaire de F0xi)