E/S 32 anormal [Résolu]

Signaler
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007
-
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007
-
Bonjour à tous
j'ai un soucis incompréhensible avec ce bout de code

for a:=ligv-31 to (ligv+1)do
begin
assignfile(h,'fichiers\'+cells[13,0]+'.txt');


reset(f);
readln(f,occ);

append(h);
writeln(h,occ);

si le fichier h est vide cela fonctionne x fois tant qu eje ne ferme pas l eprogramme !
par contre pour écrire a la suite (fichier rempli avant)j'ai droit a une erreur e/s 32 ( fichier en utilisation) or aucun programme ne l'utilise !!!! 

le but est de copié les ligne 1 à 33 du fichier f a la suite des ligne déja écrite dan le fichier h.

merci de m'éclairer ! je suis dessus depuis ce matin et même à plusieurs on trouve pas c'est bizarre comme probleme.

15 réponses

Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Ah et puis j'oubliais: postes directement le code qui pose problème, c'est plus clair pour nous que n'importe quelle explication. A condition que tes compo/variables portent des noms logiques.

Avec tout ça, tu nous validerais bien une petite réponse, non ?
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Salut !

Ben si, c'est toi qui l'utilise ce fichier !!!!!
Tu as oublié d'appeler CloseFile(f) et Closefile(h) pour fermer le fichier.

Mais personellement, je te conseille de passer par un TStringList. Une ptite recherche sur Google t'en apprendra plus.

Bonne prog'
flo

Salut,

Mon cher ToutSpeed, je vais me faire l'avocat du diable : il serait bien que tu te donnes réellement la peine de chercher, sinon on va t'appeler Luky Luke.

En 15 sec montre en main, j'ai tapé via google "Delphi+Fichiers" et je suis tombé sur ce lien

je cite (ca t'évitera de lire) :

c'est là que tout change : là on ne va pas utiliser reset() car on
ne veut pas préparer le fichier à la lecture mais on a le choix entre deux
procédures, rewrite() qui va supprimer le fichier F s'il existe et réécrire par
dessus mais on peut aussi utiliserappend()
F</italique> et
gardera ainsi les données existantes(Attention avec append s'il n'y a pas de
fichier de ce nom il y aura une erreur).

D'après mon arbre généalogique, ma famille  a inventé le pipeau (en plus c'est vrai): ben je crois que l'on a trouvé son plus grand adepte . Tu veux des parts de marchés peut etre ?

@+

Ps : Donne toi la peine de chercher un peu plus stp à l'avenir
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007

dsl mais j'ai oublié une partie du code et j'ai bien mis les closefile() !

j'ai d'ailleurs appris cela grace a ce site francky !

revoila mon code
plus haut on a un assignfile pour le fichier f

for a:=ligv-31 to (ligv+1)do
begin
assignfile(h,'fichiers\'+cells[13,0]+'.txt'); reset(f);
readln(f,occ);

append(h);
writeln(h,occ);
closefile(h);

end;

et plus bas un closefile pour le fichier f

mais je vais rejeter un coup doeil ! je me demande si ce n'est pas a cause du code entre le premier assignfile  et le début de la boucle

Oh pardon j'ai dis une grosse boulette (Autant pour moi : c'est à cause de tes variables, elles sont un peu pourris ).

Tu sais qu'il y a plus simple pour copier un fichier ? Voir ici

Re,

Et ca donne quoi ca ?

Var
Index:Cardinal;
SourceFile,DestFile:TextFile;
Str:String;
Begin
If not FileExists(SourceFile) then Exit;
For Index:=(Ligv-31) to (Ligv+1) Do
  Begin
  AssignFile(SourceFile);
  AssignFile(DestFile);
  Reset(SourceFile);
  If FileExists(DestFile) then Append(DestFile) Else Rewrite(DestFile);
  While not EOF(SourceFile) Do
    Begin
    ReadLn(SourceFile,Str); 
    WriteLn(DestFile,Str);
    End;
  CloseFile(SourceFile);
  CloseFile(DestFile);
  End;
end;
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007

procedure TForm1.Button1Click(Sender: TObject);
var nbch:extended;
f:textfile;
g:textfile;
h:textfile;
i:integer;
j:integer;
a:integer;
ligv:integer;
occ:string;

begin
with stringgrid1 do begin
ligv:=32;  // je souhaite lire la ligne 32
if FileExists('fichiers\'+cells[12,0]+'.txt')
then
begin
assignfile(f,'fichiers\'+cells[12,0]+'.txt');

nbch:=strtoint(compteligne(cells[12,0]))/33;   // je déduis le nombre de chantier
                      
car toute les 33 lignes j'en ai un nouveau

for  i:=1 to round(nbch) do begin        // on parcours autant de fois qu'il y a de chantiers
reset(F);  //on se place au début
   for j:=1 to ligv do begin   // jusque la ligne voulue

       readln(f,occ); //  on recupere al ligne voulu

       end;

if occ='0' then  // si la ligne voulu = '0'
begin
showmessage(inttostr(ligv));   // info pour dire ou on se situe dans le prog

// ici on attaque le bout de code permettant de copier les ligne 1 à 33 si il y a un '0' à la //ligne 32
//ou ligne 34à 65 si il y a un '0' à la ligne 34
//on ajoute 33 à chaque fois..................................

for a:=ligv-31 to (ligv+1)do                           
begin
assignfile(h,'fichiers\'+cells[13,0]+'.txt');

reset(f);
readln(f,occ);
//showmessage(occ);

append(h);
//showmessage('append');
writeln(h,occ);
end;
end;
 ligv:=ligv+33;
end;
end;
end;
end;

de plus cela marche quand le fichier 2 est vide ! donc...

merci
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007

j'ai retranscrit ton code en prenant en compte le mien et voila

( je précise qu ece la me sort toujours l'erreur et que les fichiers existe
  et que cela est vérifier plus haut  par une fonction précédente, de plu sles fichiers sont fermer par la fonction précédente.)

En plus le programme marche quand je vide le fichier de destination meme avec ton code ;)  ( je peux cliquez plusieur fois lors de l apremiere instance et ça copie !) par contre il ne marche plus à la deuxieme exécution!

Je comprend pas du tout pourquoi !

Que se passe t il a la fermeture du programme !????lol

merci de ton aide

voici le code !

For Index:=(Ligv-31) to (Ligv+1) Do

begin

assignfile(f,'fichiers\'+cells[12,0]+'.txt');
assignfile(h,'fichiers\'+cells[13,0]+'.txt');
reset(f);
append(h);

readln(f,occ);
writeln(h,occ);

closefile(f);
   closefile(h);

end;
end;
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Purééeeee ! Je comprends pourquoi à plusieurs vous n'arrivez pas à trouver l'origine du problème !
Y'a pas un seul composant de nommé, tes variables ont des noms d'une seule lettre pour la plupart.

T'a trois fichiers, on sait même pas lequel sert à quoi !

En plus, entre le code que tu as posté dans ton deuxième message et celui-ci les CloseFile() ont disparu... bizarre tout ça...

Et puis, tu pourrais au moins mettre en rouge la ligne qui beuge, ça peut servir ...
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Ah tiens, croisement de messages.
Mes remarques concernant le CloseFile() concernent donc le code d'avant. Ils sont revenus maintenant.... encore un coup du destin.

Allez, je laisse 3615 te résoudre ton problème, moi j'abdique.

++

PS: prière d'écrire français, maglré les clvaiers qui invresent les lerttes
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007

Merci à tous et désolé du dérangement à l'avenir je relirai TOUT mon code et vérifierai que tout ce qui doit être fermé est fermé !

J'avais oublié UN "closefile()"  à l'autre bout de mon code !   

j'me sens tout bête lol !  mékilécon !

merci et a bientot
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
Un truc pour ne pas oublier de libérer/fermer: tu écris le code de fermeture AVANT d'écrire le code d'ouverture.

En gros, tu écrirais d'abord les ".Free" avant les "BBB := Txxx.Create"

Et nomme tes composants !
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007

Plutôt 2 fois qu'une !

merci de vos conseils.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
17
Salut,




TouTSpeed , t'es too speed !



@Francky:  Quelle famille!
                Et tu prévois de te reproduire aussi, toi, perso?..



(On n'est pas sorti des gaz à effet de serre!)
Messages postés
72
Date d'inscription
jeudi 5 janvier 2006
Statut
Membre
Dernière intervention
30 août 2007

Oui m'sieur lol