Précédent   Forum des professionnels en informatique > Autres langages > Pascal
Pascal Forum d'entraide sur la programmation en langage Pascal et sur les EDI. Avant de poster -> la F.A.Q Pascal, les cours
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/10/2011, 18h31   #1
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : octobre 2011
Messages : 4
Points : 0
Points : 0
Par défaut Modification d'un fichier texte

Bonjour,

Récemment je me suis intéressé à la manipulation de fichiers textes avec le pascal, mais je rencontre des difficultés.

J'aimerais aller piocher des informations dans un fichier texte, et en remplacer.
Pour simplifier le problème, le fichier texte (en réalité un dat) sera le suivant :
Et l'objectif sera de faire un programme qui parcours le fichier texte en remplaçant les 1 par des 2. On devrait donc obtenir à la fin :

J'écris donc le programme suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PROGRAM lecteurtxt(F);
 
VAR F : text; S : string;
 
BEGIN
	assign(F, 'texte.dat');
	filemode:=2;
	rewrite(F);
 
	WHILE NOT eof(F) DO BEGIN
		readln(F,S);
		IF S='1' THEN writeln(F,'2');
	END;
 
	close(F);
END.
Résultat : le programme ne fait que vider le fichier texte (j'ai l'impression qu'il plante en cours de route).


En fait, mon but final serait d'avoir une fonction "lireLigne(F:text ; n:integer): string;" qui renvoie la chaine de caractères de la ligne n du fichier F, et une procédure "remplacerLigne(F:text ; n:integer ; S:string);" qui supprime la ligne n du fichier F pour mettre à la place la chaine de caractères S.


Merci d'avance...
Monsieur Griboux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2011, 00h57   #2
Membre expérimenté
 
Inscription : avril 2002
Messages : 424
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 424
Points : 536
Points : 536
Je t'ai fait un petit programme explicatif à partir du tien pour que tu vois bien les étapes (tu peux ensuite virer les "writeln" et les "readln" qui ne sont là que comme "points d'arrêt".

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
program lecteurtxt;
 
type
 tab = array[1..10] of string;
 
VAR F : text; S : string;  i:integer; MonTableau : tab;
 
BEGIN
 
 
 
    i:=0;
	assign(F,'texte.dat');
	filemode:=2;
	reset(F);
 
	WHILE NOT eof(F) DO 
         BEGIN
                inc(i);
		readln(F,S);
                MonTableau[i]:=s;
                writeln('Montableau ',i,' est : ', s);
                if MonTableau[i]='1' THEN  MonTableau[i]:='2';
                writeln('maintenant Montableau ',i,' est : ', Montableau[i]);
                readln;
         END;
 
         readln;
        writeln('fermeture fichier');
        writeln('assignation fichier');
        readln;
        assign(F,'texte.dat');
         filemode:=2;
         writeln('réouverture en écriture');
         readln;
	rewrite(F);
        readln;
        writeln('nouvelle boucle');
 
                for i:=1 to 10 do
                BEGIN
                writeln(F, MonTableau[i]);
                writeln(' s vaut : ', Montableau[i]);
                readln;
                 END;
 
      close(F);
 
 
END.
Ce programme suppose que tu as 10 valeurs dans ton fichier. A priori on ne sait pas combien de valeurs on a, il faut donc incrémenter une variable quand on lit le fichier. Cette variable devient l'index maximum du tableau.
__________________
"Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
richard est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/10/2011, 17h29   #3
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : octobre 2011
Messages : 4
Points : 0
Points : 0
Erm, ce programme lit en effet ce qu'il y a dans le texte, mais en ouvrant le fichier après le passage du programme, rien n'a changé
J'ai l'impression qu'il plante lors de la réécriture...

Merci pour la réponse, je vois comment piocher des informations dans le texte maintenant.
Par contre pour en écrire, le problème n'est toujours pas résolu...
Monsieur Griboux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 18h38   #4
Membre confirmé
 
Avatar de titeeee
 
Homme Titouan Créac'h
Lycéen
Inscription : mai 2009
Messages : 193
Détails du profil
Informations personnelles :
Nom : Homme Titouan Créac'h
Âge : 18
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : mai 2009
Messages : 193
Points : 257
Points : 257
Un conseil, si tu ne souhaite pas obligatoirement que ton utilisateur puisse ouvrir ton fichier avec le bloc-not, tu peux utiliser les fichiers typés.

Code :
IntegerFIle : File of Integer;
par exemple. ça simplifie vachement la vie.
titeeee est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 14/10/2011, 19h33   #5
Membre expérimenté
 
Inscription : avril 2002
Messages : 424
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 424
Points : 536
Points : 536
Citation:
Envoyé par Monsieur Griboux Voir le message
Erm, ce programme lit en effet ce qu'il y a dans le texte, mais en ouvrant le fichier après le passage du programme, rien n'a changé
J'ai l'impression qu'il plante lors de la réécriture...
.

Bonsoir,

Voici le contenu du fichier test.dat avant l'utilisation du programme que j'ai donné :

Code :
1
2
3
4
5
6
7
8
9
 
1
1
1
0
0
1
1
0

Et voici le contenu de même fichier après l'utilisation de mon programme :

Code :
1
2
3
4
5
6
7
8
9
 
2
2
2
0
0
2
2
0
Les "1" ont bien été remplacés par des "2" comme tu l'as demandé.

Explique-moi ce qui ne va pas car je ne comprends pas.
__________________
"Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
richard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 20h21   #6
Membre expérimenté
 
Inscription : avril 2002
Messages : 424
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 424
Points : 536
Points : 536
Citation:
Envoyé par titeeee Voir le message
Un conseil, si tu ne souhaite pas obligatoirement que ton utilisateur puisse ouvrir ton fichier avec le bloc-not, tu peux utiliser les fichiers typés.

Code :
IntegerFIle : File of Integer;
par exemple. ça simplifie vachement la vie.
Excuse-moi, je ne veux pas paraître soupe au lait mais quel est le rapport entre ton message et la question posée par Mr Griboux ?
__________________
"Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
richard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 20h01   #7
Membre confirmé
 
Avatar de titeeee
 
Homme Titouan Créac'h
Lycéen
Inscription : mai 2009
Messages : 193
Détails du profil
Informations personnelles :
Nom : Homme Titouan Créac'h
Âge : 18
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : mai 2009
Messages : 193
Points : 257
Points : 257
Citation:
Envoyé par richard Voir le message
Excuse-moi, je ne veux pas paraître soupe au lait mais quel est le rapport entre ton message et la question posée par Mr Griboux ?
Je lui dis juste que les fichiers typée sont plus simple à utiliser que les fichiers textes. Comme il dit que ce sont des .DAT, c'est pour stocker des données. Il n'a peut être pas envie que tout le monde puisse ouvrir ce fichier avec son éditeur de texte préféré. Peut-être qu'il utilise les fichiers textes en dépit car il ne connaît pas les fichiers typés (comme moi au début). Bref peut être que ça l'aidera, peut être pas, mais étant donnée qu'un message ne coûte rien, ça vaut le coup d'essayer non ?
titeeee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 22h46   #8
Membre expérimenté
 
Inscription : avril 2002
Messages : 424
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 424
Points : 536
Points : 536
Ah, OK.

J'avais pensé que tu lui suggérais qu'en changeant le type de ses variables il allait résoudre son problème (que je ne comprends toujours pas d'ailleurs puisque le programme que je lui ai fourni fonctionne parfaitement sur mon PC).
__________________
"Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
richard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 20h47   #9
Membre confirmé
 
Avatar de titeeee
 
Homme Titouan Créac'h
Lycéen
Inscription : mai 2009
Messages : 193
Détails du profil
Informations personnelles :
Nom : Homme Titouan Créac'h
Âge : 18
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : mai 2009
Messages : 193
Points : 257
Points : 257
c'est parce qu'il fonctionnait, que je n'ai pas eu besoins de l'aider à le résoudre
titeeee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 18h05   #10
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : octobre 2011
Messages : 4
Points : 0
Points : 0
Citation:
Envoyé par richard Voir le message
voici le contenu de même fichier après l'utilisation de mon programme :

Code :
1
2
3
4
5
6
7
8
9
 
2
2
2
0
0
2
2
0
Les "1" ont bien été remplacés par des "2" comme tu l'as demandé.

Explique-moi ce qui ne va pas car je ne comprends pas.
C'est étrange, chez moi le même programme ne modifie pas le fichier texte.
J'ai l'impression qu'il plante après avoir dit "réouverture en écriture" : il affiche des caractères bizarres une fraction de secondes, et se ferme
Monsieur Griboux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 22h40   #11
Membre expérimenté
 
Inscription : avril 2002
Messages : 424
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 424
Points : 536
Points : 536
J'utilise FreePascal et windows XP mais je en vois pas en quoi cela peut jouer. En revanche il y a peut-être un problème de chemin. Il faut essayer de mettre le programme et le fichier dans le même répertoire (en cas d'utilisation de Turbo Pascal je crois me souvenir qu'il ne faut pas de nom de répertoire supérieur à 8 lettres, limitation héritée de DOS ou de signes autres que des lettres et des chiffres mais c'est à vérifier).

Mon programme fonctionne forcément donc il y a un autre problème peut-être un pb de chemin relatif ou quelque chose de ce type.
__________________
"Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
richard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2011, 20h43   #12
Candidat au titre de Membre du Club
 
Inscription : avril 2010
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 13
Points : 14
Points : 14
voici une solution avec les fichiers textes:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
PROGRAM lecteurtxt(F);
uses wincrt;
VAR f,f2: text; S : string; n:integer;
procedure saisie(var f:text;var n:integer);
var i:integer ;
begin
rewrite(f);
    repeat
    writeln('donner le nombre de caractéres a ajouter');readln(n);
    until n > 2 ;
    for i:= 1 to n do
    begin
     writeln('donner un caractére (0,1)');readln(s);
     writeln(f,s);
    end;
close(f);
end;
procedure remplacer(var f,f2:text);
begin
rewrite(f2);
reset(f);
        while not(eof(f)) do     
         begin
          readln(f,s);
          if s='1' then writeln(f2,'2')
                   else writeln(f2,'0');
          end;
close(f);
close(f2);
end;
procedure affichage(var f2:text);
begin
reset(f2);
reset(f);
write('le fichier initial : ');
           while not(eof(f)) do
            begin
            readln(f,s);
            write(s,' ');
            end;
writeln;
write('le fichier modifier : ');
 
          while not(eof(f2)) do
            begin
            readln(f2,s);
            write(s,' ');
            end;
close(f2);
close(f);
 
end;
 
BEGIN
	assign(F,'c:\texte.txt');
        assign(F2,'c:\texte2.temp');
	filemode:=2;
        saisie(f,n);
        remplacer(f,f2);
        clrscr;
        affichage(f2);
 
END.
concernant ton code tu peux utiliser
Code :
1
2
3
4
5
6
7
8
9
PROGRAM lecteurtxt(F);
uses wincrt;
type F_ent=file of integer;
VAR F : f_ent; S : string;
 
BEGIN
	assign(F, 'texte.dat');
...
END.
extrem-alpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 16h28   #13
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Suisse

Informations forums :
Inscription : octobre 2011
Messages : 4
Points : 0
Points : 0
Merci.

Mon compilateur m'indique qu'il ne connait pas "clrscr;" mais je vais faire sans, je suppose que c'est juste pour nettoyer l'écran.
Monsieur Griboux est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h49.


 
 
 
 
Partenaires

Hébergement Web