Lire est une chose, écrire dans un fichier en est une autre. L’écriture utilise l’instruction Ecrire, une fonction qui prend
comme paramètre le nom logique du fichier et l’enregistrement (la ligne) à écrire. Vous trouverez tout comme
l’instruction de lecture, une instruction EcrireFichier strictement identique :
Ecrire(nom_logique,enregistrement)
Comme vous devez écrire des enregistrements à largeur fixe, c’est à vous de vérifier que les enregistrements sont à
la bonne longueur. S’ils sont trop longs, vous avez mal dimensionné vos enregistrements à l’origine (un cas régulier
est une adresse à rallonge ou un nom de ville composé). S’ils sont trop courts, vous devrez leur rajouter des espaces
en fin de chaîne.
Par exemple, toujours dans l’exemple des logins, que faire si celuici est trop court, par exemple "toto", donc quatre
caractères, alors qu’il devrait en faire huit ? L’astuce consiste à rallonger le login avec des espaces. Ce n’est pas un
problème pour le relire, puisque la fonction trim() restaurera son état d’origine. Il est probable que votre langage de
programmation propose une fonction qui remplit toute seule les morceaux manquants, des fois il s’agit même de
l’instruction d’écriture (le fprintf du C le fait très bien).
En attendant, vous pouvez programmer vousmême cette fonction algorithmique. Elle ressemble fortement à la
procédure RepeteCar(). Appelezla Formate(). Elle prendra comme paramètre le champ de l’enregistrement et la
longueur attendue. Elle retournera ce même champ mais reformaté : soit coupé à la bonne longueur, soit avec des
espaces rajoutés à la fin.
Fonction Formate(champ :chaîne, longueur :entier) :entier
Var
nbspaces,len :entiers
Début
len=longueur(champ)
Si len>longueur Alors
champ=gauche(chaîne,longueur)
Sinon
nbspaces=longueur-len
Tant que nbspaces<>0 Faire
champ=champ&" "
nbspaces=nbspaces-1
FinTantQue
FinSi
Retourne champ
FinFonct
Quelques formalismes algorithmiques autorisent parfois de préciser à l’avance une longueur de chaîne à la
déclaration de la variable.
Var
login :chaîne de 8 caractères
Cela laisse entendre que vous n’avez plus à vous soucier que la chaîne soit trop courte ou trop longue. C’est vrai
dans l’algorithme, mais attention dans un vrai langage ! Le langage COBOL anciennement au programme du BTS était
un régal à ce niveau mais en C ou en Java, la taille n’est pas précisée.
La fonction Formate() fait bien votre affaire. Vous pouvez reconstruire votre enregistrement, puis l’écrire.
Programme ECRIT
Var
fic :fichier séquentiel
nom,ligne:chaînes
tlogin,tuid,tpwd,tgid,tcmt,thome,tshell:chaînes
uid,gid:entiers
Début
nom←"passwd"
Ouvrir nom dans fic en Ajout
login←"toto"
uid←500
gid←501
...
/* reconstitution */
tlogin←Formate(tlogin,8)
tuid←Formate(numch(uid),5)
tgid←Formate(numch(gid),5)
tpwd←Formate(tpwd,1)
tcmt←Formate(tcmt,15)
- 3 -
© ENI Editions - All rigths reserved - Jonifar lina
157
comme paramètre le nom logique du fichier et l’enregistrement (la ligne) à écrire. Vous trouverez tout comme
l’instruction de lecture, une instruction EcrireFichier strictement identique :
Ecrire(nom_logique,enregistrement)
Comme vous devez écrire des enregistrements à largeur fixe, c’est à vous de vérifier que les enregistrements sont à
la bonne longueur. S’ils sont trop longs, vous avez mal dimensionné vos enregistrements à l’origine (un cas régulier
est une adresse à rallonge ou un nom de ville composé). S’ils sont trop courts, vous devrez leur rajouter des espaces
en fin de chaîne.
Par exemple, toujours dans l’exemple des logins, que faire si celuici est trop court, par exemple "toto", donc quatre
caractères, alors qu’il devrait en faire huit ? L’astuce consiste à rallonger le login avec des espaces. Ce n’est pas un
problème pour le relire, puisque la fonction trim() restaurera son état d’origine. Il est probable que votre langage de
programmation propose une fonction qui remplit toute seule les morceaux manquants, des fois il s’agit même de
l’instruction d’écriture (le fprintf du C le fait très bien).
En attendant, vous pouvez programmer vousmême cette fonction algorithmique. Elle ressemble fortement à la
procédure RepeteCar(). Appelezla Formate(). Elle prendra comme paramètre le champ de l’enregistrement et la
longueur attendue. Elle retournera ce même champ mais reformaté : soit coupé à la bonne longueur, soit avec des
espaces rajoutés à la fin.
Fonction Formate(champ :chaîne, longueur :entier) :entier
Var
nbspaces,len :entiers
Début
len=longueur(champ)
Si len>longueur Alors
champ=gauche(chaîne,longueur)
Sinon
nbspaces=longueur-len
Tant que nbspaces<>0 Faire
champ=champ&" "
nbspaces=nbspaces-1
FinTantQue
FinSi
Retourne champ
FinFonct
Quelques formalismes algorithmiques autorisent parfois de préciser à l’avance une longueur de chaîne à la
déclaration de la variable.
Var
login :chaîne de 8 caractères
Cela laisse entendre que vous n’avez plus à vous soucier que la chaîne soit trop courte ou trop longue. C’est vrai
dans l’algorithme, mais attention dans un vrai langage ! Le langage COBOL anciennement au programme du BTS était
un régal à ce niveau mais en C ou en Java, la taille n’est pas précisée.
La fonction Formate() fait bien votre affaire. Vous pouvez reconstruire votre enregistrement, puis l’écrire.
Programme ECRIT
Var
fic :fichier séquentiel
nom,ligne:chaînes
tlogin,tuid,tpwd,tgid,tcmt,thome,tshell:chaînes
uid,gid:entiers
Début
nom←"passwd"
Ouvrir nom dans fic en Ajout
login←"toto"
uid←500
gid←501
...
/* reconstitution */
tlogin←Formate(tlogin,8)
tuid←Formate(numch(uid),5)
tgid←Formate(numch(gid),5)
tpwd←Formate(tpwd,1)
tcmt←Formate(tcmt,15)
- 3 -
© ENI Editions - All rigths reserved - Jonifar lina
157
