Il est difficile de "dépanner" sans avoir un exemple précis.
1 - Tout d'abord, ce qu'il faut savoir:
- on peut écrire avec ou sans délimiteur,
- on lit ce qu'il y a entre deux délimiteurs, ou entre le début du fichier et un délimiteur (pour la lecture en tête du fichier), ou entre le dernier délimiteur et la fin du fichier (pour une lecture en fin de fichier),
- tout ce qu'on écrit dans un fichier texte est écrit sous forme de
chaîne de caractères codés en ASCII, même une variable entière ou réelle a sa
valeur qui est codée sous forme de chaîne de caractères ASCII,
- lors d'une lecture, dans tous les cas on lit des caractères, et si on lit la valeur d'une variable entière ou réelle, il y a une conversion automatique pour retouver la valeur sous forme numérique dans la variable,
- un fichier texte n'est pas spécifique à
PANORAMIC, mais peut être lu ou écrit par tout traitement de texte, ou tout autre logiciel qui peut les manipuler.
2 - Pour les fichiers texte, le délimiteur est l'ensemble "retour en début de ligne + ligne suivante", qui a pour valeur "ODOA" en hexadécimal. Une fin de fichier est aussi un délimiteur.
3 - Il y a donc deux manières d'écrire dans un fichier texte: avec
FILE_WRITE ou avec
FILE_WRITELN:
FILE_WRITE écrit à la suite de ce qui est déjà écrit, sans insérer de délimiteur,
FILE_WRITELN écrit à la suite de ce qui est déjà écrit, puis insère un délimiteur.
4 - Voici plusieurs exemples pour fixer les idées:
Si on écrit dans un fichier texte de la manière suivante:
- Code:
-
file_open_write 1,"fich.txt"
file_write 1,"abcde"
file_write 1,"fghij"
file_close 1
On obtient un fichier fich.txt:
- qui se trouve dans le répertoire de référence, qui est le répertoire où se trouve
PANORAMIC_EDITOR ou
PANORAMIC_IDE, ou le répertoire désigné par
DIR_CHANGE.
- qui contient une seule chaîne de caractères "abcdefghij", car on a écrit "abcde" puis "fghij" sans insérer de délimiteur.
Si on lit ce fichier avec le code:
- Code:
-
dim v$
file_open_read 1,"fich.txt"
file_read 1,v$
print v$
file_close 1
On obtient alors l'affichage de "abcdefghij", car la lecture avec
file_read a mis dans la variable v$, ce qu'il y a dans le fichier depuis le pointeur courant jusqu'au délimiteur, qui est la fin du fichier.
Maintenant, si on écrit dans un fichier texte de la manière suivante:
- Code:
-
file_open_write 1,fich.txt"
file_writeln 1,"abcde"
file_writeln 1,"fghij"
file_close 1
On obtient un fichier fich.txt qui contient les deux lignes:
abcde
fghij
car on a écrit la chaîne "abcde" puis la chaîne "fghij" en insérant à chaque fois automatiquement un délimiteur après la chaîne par la commande
file_writeln.
Dans ce cas, si on lit le fichier par:
- Code:
-
dim v$
file_open_read 1,"fich.txt"
file_read 1,v$
print v$
file_close 1
On obtiendra l'affichage de "abcde", car la lecture avec
file_read a mis dans la variable v$, ce qu'il y a dans le fichier depuis le pointeur courant jusqu'au délimiteur.
5 - cas de
FILE_READLNSi on veut le lire par:
- Code:
-
dim v$
file_open_read 1,"fich.txt"
file_readln 1,v$
print v$
file_close 1
On obtient exactement la même chose car
file_readln lit une ligne, et une ligne se termine toujours par un délimiteur.
A l'utilisation, il n'y a aucune différence entre
FILE_READ et
FILE_READLN. Ce dernier avait été codé pour lire des lignes dans une variable string, puis comme par la suite, tous les types de variable ont été acceptés, ces deux mots_clés sont devenus équivalents.
FILE_READLN pourrait être supprimé pour éviter toute confusion.
6 - Ce qui est important, c'est de lire avec une variable qui est
du même type que celle utilisée à l'écriture.
Premier exemple:
Si on écrit dans un fichier texte:
- Code:
-
dim a
file_open_write 1,"fich.txt"
a=10:file_write 1,a
a=20:file_write 1,a
file_close 1
En lisant le fichier "fich.txt" avec une variable string:
- Code:
-
dim v$
file_open_read 1,"fich.txt"
file_read 1,v$
print v$
file_close 1
On obtient le texte "1020" dans la variable string v$, car les valeurs de la variable a sont converties en ASCII avant d'être écrites dans un fichier texte.
Mais, en le lisant avec une variable réelle:
- Code:
-
dim v
file_open_read 1,"fich.txt"
file_read 1,v
print v
file_close 1
on obtient la valeur 1020 dans la variable réelle v, CE QUI EST TOTALEMENT DIFFERENT.
Deuxième exemple, l'inverse du précédent:
Si on écrit dans un fichier texte:
- Code:
-
dim a
file_open_write 1,"fich.txt"
file_writeln 1,"a"
a=20:file_writeln 1,a
file_close 1
En lisant le fichier "fich.txt" avec une variable string:
- Code:
-
dim v$
file_open_read 1,"fich.txt"
file_read 1,v$
print v$
file_close 1
On va obtenir le texte "a" dans la variable v$.
Mais en le lisant en utilisant une variable réelle:
- Code:
-
dim v
file_open_read 1,"fich.txt"
file_read 1,v
print v
file_close 1
On a cette fois une ERREUR, car c'est le texte "a" qui a été écrit dans le fichier, et ce texte ne peut pas être mis dans un réel.
Espérons que ces quelques exemples te seront utiles...
Je pense que je vais faire un tutoriel sur ce sujet.