padsou
Messages postés121Date d'inscriptionjeudi 24 janvier 2002StatutMembreDernière intervention13 avril 2010
-
11 déc. 2002 à 10:48
zulot
Messages postés39Date d'inscriptiondimanche 23 mai 2004StatutMembreDernière intervention20 mai 2007
-
15 sept. 2004 à 18:05
Bonjour à tous,
j'ai un problème avec mes fichiers texte sous delphi. J'ai une procédure qui traite deux fichiers textes, une fois le traitement terminé, je fais un Closefile des deux fichiers. Puis dans une autres procédure, je retraite l'un des deux fichiers, je fais un AssignFile avec un autre nom de fichier logique et là, quand je fais le reset juste après j'ai une erreur E/S 32. C'est un problème de libération du fichier mais je ne comprends pas que le CloseFile n'ai pas libéré ledit fichier. Quelqu'un pourrait il me dire s'il a rencontré le même problème et s'il a trouvé une solution ?
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 11 déc. 2002 à 23:12
Peux-tu vérifier deux choses :
- Que le close file est bien effectué sur les fichiers ouverts.
- Que le fichier n'est pas ourvert par une autre application ( Excel, Word ou autre )
--- :sleepy) Nono40@fr.st :sleepy) ---
Nouveau ---> Nono40.fr.st
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 11 déc. 2002 à 23:21
D'après la doc Delphi, les erreurs d'e/s vont de 100 à 106.
En revanche, l'erreur code 32 (voir Win 32 programer's reference help file) indique ceci :
32L ERROR_SHARING_VIOLATION
Donc, es-tu bien sur que tu fermes ton fichier dans tous les cas ? (du style, je sors à un endroit de la procedure en oubliant de refermer un des deux fichiers).
Peux-tu nous montrer le code la première procédure qui manipule les deux fichiers textes ?
padsou
Messages postés121Date d'inscriptionjeudi 24 janvier 2002StatutMembreDernière intervention13 avril 2010 12 déc. 2002 à 09:09
Non je ferme bien mes 2 fichiers comme vous pouvez le voir dans le code qui suit. C'est justement ça qui me pose problème: Qu'il soient occupés après les avoir fermé ! Sinon je me suis débrouillé autrement. Je copie le fichier comme vous pouvez le voir dans la 2ème procédure afin de pourvoir bosser dessus.
En tous cas merci de m'aider ! [:-)]
procedure TForm1.BitBtn4Click(Sender: TObject);
var
caracter: char;
i, j, longueur, position: integer;
Ficsv, Outcsv: TextFile;
begin
if Form1.CheckBox2.Checked then
begin
try
for i := 1 to nbresult do
begin
AssignFile(Ficsv, T[i - 1]);
Reset(Ficsv);
AssignFile(OutCsv, ChangeFileExt(T[i - 1], '.out'));
Rewrite(OutCsv);
j := 1;
repeat
longueur := System.FileSize(Ficsv);
position := Filepos(Ficsv);
AnalogMeter2000X1.Value := Round((position * 100) / longueur);
Application.ProcessMessages;
Read(Ficsv, caracter);
if caracter = '"' then
begin
Append(OutCsv);
if j <> 1 then Write(OutCsv, '');
end
else
if caracter = #10 then
begin
if j <> 1 then
begin
Append(OutCsv);
Write(OutCsv, ';');
Writeln(OutCsv, '');
end;
j := 2;
end
else
if ((caracter <> #10) and (caracter <> '"')) then
begin
Append(OutCsv);
if j <> 1 then Write(OutCsv, caracter);
end;
until Eof(Ficsv);
end;
finally
CloseFile(Ficsv);
CloseFile(OutCsv);
end;
end; if ((ListBox1.Items.Count 0) and (CheckBox1.Checked False)) then
begin
ShowMessage('Veuillez spécifier un fichier de clients ou cocher la case');
end
else
begin
GroupBox1.Visible := False;
GroupBox2.Visible := True;
end;
end;
// deuxieme procédure
procedure TForm1.BitBtn2Click(Sender: TObject);
var
i, j, k, s, Posfic: integer;
Lignenr, Newline, Newcol, wait, compar, Trash: string;
Posi, Longfic: Real;
Newname: TFilename;
InFile, OutFile: TextFile;
begin
if SaveDialog1.Execute then
begin
Form1.Enabled := False;
s := 0;
k := 0;
try
T := TStringList.Create;
for i := 1 to ListBox1.Items.Count do
begin
T.Add(ListBox1.Items.Strings[i - 1]);
end;
repeat
begin
if CheckBox2.Checked = True then
begin
Newname := ChangeFileExt(T[k], '.out');
Label5.Caption := ChangeFileExt(T[k], '.out');
fileCopy(Newname, ChangeFileExt(Newname, '.txt'));
AssignFile(InFile, ChangeFileExt(Newname, '.txt'));
Reset(InFile);
end
else
begin
Label5.Caption := T[k];
AssignFile(InFile, T[k]);
Reset(InFile);
end;
AssignFile(OutFile, SaveDialog1.FileName);
Longfic := System.FileSize(InFile);
if FileExists(SaveDialog1.FileName) then Append(OutFile) else Rewrite(OutFile);
i := 0;
while not Eof(InFile) do
begin
Posfic := Filepos(InFile);
if LongFic > 1 then
begin
Posi := (100 * (Posfic)) / (Longfic);
dxfProgressBar1.Position := Round(Posi);
AnalogMeter2000X1.Value := Round(Posi);
Application.ProcessMessages;
end;
inc(i);
Label4.Caption := IntTostr(i);
Readln(InFile, Lignenr);
j := 0;
Newline := '';
if (j = 0) then
begin
wait := lignenr;
if ((ComboBox1.ItemIndex = 2) and not (CheckBox2.Checked)) then
begin
Trash := StrToken(Lignenr, ';');
Compar := StrToken(Lignenr, ';');
Trash := StrToken(Lignenr, ';');
Compar := Format('%.5d', [StrToInt(Compar)]);
Trash := Compar + ';' + Format('%.3d', [StrToInt(Trash)]);
end
else
if ((ComboBox1.ItemIndex = 2) and (CheckBox2.Checked)) then
begin
Trash := StrToken(Lignenr, ';');
Compar := StrToken(Lignenr, ';');
Compar := Copy(Compar, Length(Compar) - 4, 5);
//Trash := StrToken(Lignenr, ';');
Trash := Format('%.3d', [StrToInt(Trash)]);
Compar := Trash + ';' + Format('%.5d', [StrToInt(Compar)]);
end
else
begin
compar := StrToken(Lignenr, ';');
compar := compar + ';' + StrToken(Lignenr, ';');
end;
end;
lignenr := wait;
wait := '';
if ((StrHolder1.Strings.indexOf(Trash) <> -1) or (CheckBox1.Checked = True)) then
begin
while (Lignenr <> '') do
begin
Newcol := StrToken(Lignenr, ';');
inc(j);
case ComboBox1.ItemIndex of
0: // Contrats.txt if (j 1) or (j 2) or (j = 3) or (j = 4) or (j = 5) or (j = 6) or (j = 7) or (j = 8) or (j = 9) or (j = 10) or (j = 11) or (j = 13) then
begin
if (j = 13) then Newline := Newline + ';;;;' + Newcol + ';'
else if (j = 1) then
begin
Newcol := Format('%.3d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else if (j = 2) then
begin
Newcol := Format('%.5d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else Newline := Newline + Newcol + ';';
end;
1: // Débits.txt if (j 1) or (j 2) or (j = 7) then
begin
if (j = 1) then
begin
Newcol := Format('%.3d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else if (j = 2) then
begin
Newcol := Format('%.5d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else Newline := Newline + Newcol + ';';
end;
2: // Montants.txt
if CheckBox2.Checked = True then
begin if (j 1) or (j 2) or (j = 4) or (j = 5) or (j = 8) or (j = 9) then
begin
if (j = 1) then
begin
Newcol := Format('%.3d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else if (j = 2) then
begin
Newcol := Copy(Newcol, 4, 5);
Newcol := Format('%.5d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else Newline := Newline + Newcol + ';';
end;
end
else
begin if (j 2) or (j 3) or (j = 4) or (j = 5) or (j = 12) or (j = 22) then
begin
if (j = 3) then
begin
Newcol := Format('%.3d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else if (j = 2) then
begin
Newcol := Format('%.5d', [StrToInt(Newcol)]);
Newline := Newline + Newcol + ';';
end
else Newline := Newline + Newcol + ';';
end;
end;
end;
end;
Application.ProcessMessages;
inc(s);
Label7.Caption := IntToStr(s);
if FileExists(SaveDialog1.FileName) then Append(OutFile) else Rewrite(OutFile);
Writeln(OutFile, Newline);
ListBox3.Items.Add(Newline);
end;
end;
Closefile(InFile);
Closefile(OutFile);
inc(k);
end;
until k = nbresult;
Showmessage('Traitement achevé avec succès');
Form1.Enabled := True;
BitBtn1.Visible := True;
Label4.Visible := False;
Label3.Visible := False;
finally
end;
end;
end;
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 12 déc. 2002 à 22:27
La procédure append n'est à utiliser que pour ouvrir un fichier texte en mode ajout et non à chaque fois que l'on doit ajouter un caractère ou une ligne.
D'ailleurs l'aide en ligne est claire :
"procedure Append(var F: Text);
Description : La procédure Append ouvre un fichier existant de nom F en vue d'y ajouter du texte..."
Aussi, en résumant, voici une construction classique pour ajouter du texte d'un fichier (FicSv) dans un autre fichier texte (OutCsv), caractère par caractère :
AssignFile(Ficsv, 'Test.txt');
AssignFile(OutCsv, 'csv.txt');
try
Reset(Ficsv);
Rewrite(Outcsv);
repeat
Read(Ficsv, caracter);
Write(OutCsv, ';', caracter);
until Eof(Ficsv);
finally
CloseFile(FicSv);
CloseFile(OutCsv);
end;
Peu importe ce qui est écrit ici, c'est le principe qui compte : on ouvre en mode ajout 1 seule fois, on écrit autant de fois que nécessaire avec Write ou WriteLn puis on ferme les fichiers UNE seule fois.
Tu peux revoir les chapitres sur les fichiers sur l'excellent didacticiel de Frédéric BEAULIEU, je te les recommande.
J'aurai une petite remarque à propos de ton code :
si le caractère lu n'est pas égal à '"', puis s'il n'est pas égal à #10, alors il est forcément différent de '"' et de #10, non ?
Dans la mesure ou tu testes la valeur d'un caractère, je pense que gagnerais en lisibilité en utilisant une structure case.
case caracter of
'"' : begin...end;
#10 : begin...end;
else
begin...end;
end;
Méfies-toi des if..else en cascade.
padsou
Messages postés121Date d'inscriptionjeudi 24 janvier 2002StatutMembreDernière intervention13 avril 2010 12 déc. 2002 à 23:15
Hé bé merci de toutes ces remarques, merci bcp !
Et pis de toutes façons, l'optimisation de code n'est pas ma principale préocuppation. J'essaye de faire marcher mon prog et pis seulement après je l'optimise. Merci encore !
zulot
Messages postés39Date d'inscriptiondimanche 23 mai 2004StatutMembreDernière intervention20 mai 2007 15 sept. 2004 à 18:05
SAlut moi j'ai a peu pres le meme probleme que la personne sauf que un coup ca me sort ereur 104 une autre fois 102 et maintenant j'ai saisie numerique incorrecte alors je comprend pas trop
Voila le code
Procedure reecrire;
var fichier,fichier_temp:Textfile;
ligne:integer;
begin
AssignFile(fichier, 'annuaire.txt');
Assignfile(fichier_temp, 'annuaire_temp.txt');
try
Reset(fichier);
Rewrite(fichier_temp);
Repeat
readln(fichier, ligne);
writeln(fichier_temp, ligne);
until SEEKEOF(fichier);
finally
CloseFile(fichier);
CloseFile(fichier_temp);
end;
end;
ET ca merde au niveau du Readln des le premier passage.