Système de fichiers
Le NXT peut écrire et lire des fichiers, stockés dans sa mémoire flash. Ainsi, vous pouvez enregistrer un enregistrement de données à partir des données du capteur ou lire des chiffres lors de l'exécution du programme. La seule limite au nombre de fichiers et la dimension est la taille de la mémoire flash. Les fonctions de l'API NXT vous permettent de gérer les fichiers (créer, renommer, supprimer, trouver), vous permettent de lire et d'écrire des chaînes de texte, des nombres et les octets.
Dans le prochain exemple, nous verrons comment créer un fichier, y écrire des chaînes de caractères et le renommer.
Tout d'abord, le programme supprime les fichiers avec les noms que nous allons utiliser : ce n'est pas une bonne habitude (il faut vérifier l'existence de fichiers, le supprimer manuellement ou automatiquement choisir un autre nom pour notre fichier dans lequel nous travaillerons), mais il n'y a pas de problème dans notre simple cas. Il crée notre fichier parCreateFile("Danny.txt", 512, fileHandle), en précisant le nom, la taille et un lien vers le fichier, où le firmware NXT va écrire un certain nombre pour ses propres utilisations.
Ensuite, il génère des chaînes et les écrit dans le fichier avec WriteLnString(fileHandle, string, bytesWritten), où tous les paramètres doivent être des variables. Enfin, le fichier est fermé et renommé. N'oubliez pas: un fichier doit être fermé avant de commencer une autre opération, si vous avez créé un fichier, vous pouvez y écrire, si vous voulez le lire, vous devez le fermer et l'ouvrir avec OpenFileRead(); pour supprimer / renommer, vous devrez le fermer.
#define OK LDR_SUCCESS
task main(){
byte fileHandle;
short fileSize;
short bytesWritten;
string read;
string write;
DeleteFile("Danny.txt");
DeleteFile("DannySays.txt");
CreateFile("Danny.txt", 512, fileHandle);
for(int i=2; i<=10; i++ ){
write = "NXT is cool ";
string tmp = NumToStr(i);
write = StrCat(write,tmp," times!");
WriteLnString(fileHandle,write, bytesWritten);
}
CloseFile(fileHandle);
RenameFile("Danny.txt","DannySays.txt");
}
Pour voir le résultat, BricxCC -> Tools -> NXT Explorer, récupérez DannySays.txt et observez. Prêt pour le prochain exemple ! Nous allons créer une tableau de caractères ASCII.
task main(){
byte handle;
if (CreateFile("ASCII.txt", 2048, handle) == NO_ERR) {
for (int i=0; i < 256; i++) {
string s = NumToStr(i);
int slen = StrLen(s);
WriteBytes(handle, s, slen);
WriteLn(handle, i);
}
CloseFile(handle);
}
}
Vraiment simple, ce programme crée le fichier et si aucune erreur n'est survenue, il écrit un nombre entre 0 er 255 (le convertir en chaîne de caractère avant) avec writeBytes (handle, s,slen), qui est une autre façon d'écrire des chaînes sans retour chariot ; puis il écrit le nombre avec WriteLn (handle, valeur) qui ajoute un retour chariot à la fin. Le résultat, que vous pouvez voir en ouvrant ASCII.txt avec un éditeur de texte, est explicable: le nombre écrit sous forme de chaîne est représentée d'une manière lisible par un humain, alors que le nombre est écrit comme valeur hexadécimale à interpréter et présentée comme un code ASCII.
Deux fonctions importantes restent à être montré: ReadLnString pour lire des chaînes à partir de fichiers et Readln pour lire les nombres.
Maintenant, pour l'exemple de la première fonction : la tâche principale appelle la sous-routine CreateRandomFile qui crée un fichier avec des nombres aléatoires dedans (écrit sous forme de chaînes); vous pouvez commenter cette ligne et utiliser un autre fichier texte créé à la main pour cet exemple.
Dans la sous-routine CreateRandomFile nous produisons une quantité prédéfinie de nombres aléatoires, les convertissons en chaîne de caractères et les écrivons dans le fichier.
Le ReadLnString accepte un lien vers le fichier et une variable de chaîne comme arguments: après l'appel, la chaîne contient une ligne de texte et la fonction retourne un code d'erreur, que nous pouvons utiliser pour savoir si la fin du fichier a été atteinte.
#define FILE_LINES 10
sub CreateRandomFile(string fname, int lines){
byte handle;
string s;
int bytesWritten;
DeleteFile(fname);
int fsize = lines*5;
// Crée le fichier
if(CreateFile(fname, fsize, handle) == NO_ERR) {
int n;
repeat(FILE_LINES) {
int n = Random(0xFF);
s = NumToStr(n);
WriteLnString(handle,s,bytesWritten);
}
CloseFile(handle);
}
}
task main(){
byte handle;
int fsize;
string buf;
bool eof = false;
CreateRandomFile("rand.txt",FILE_LINES);
if(OpenFileRead("rand.txt", fsize, handle) == NO_ERR)
{
TextOut(10,LCD_LINE2,"Filesize:");
NumOut(65,LCD_LINE2,fsize);
Wait(600);
until (eof == true)
{
if(ReadLnString(handle,buf) != NO_ERR)
eof = true;
ClearScreen();
TextOut(20,LCD_LINE3,buf);
Wait(500);
}
}
CloseFile(handle);
}
Dans le dernier programme, je vais vous montrer comment lire les numéros d'un fichier. Je profite de l'occasion pour vous donner un petit échantillon de la compilation conditionnelle. Au début du code, il ya une définition qui n'est pas utilisé pour une macro ni pour un alias: nous définissons simplement INT.
Ensuite, il ya une déclaration préprocesseur
#ifdef INT
...code...
#endif
qui indique simplement au compilateur de compiler le code entre les deux états si l'INT comme cela a été défini précédemment. Donc, si nous définissons INT, la tâche principale à l'intérieur du premier couplet sera compilé et si LONG est défini au lieu de l'INT, la deuxième version sera compilée.
Cette méthode me permet de montrer dans un seul programme comment les deux types int (16 bits) et long (32 bits) peuvent être lus depuis un fichier en appelant la même fonctionReadln(handle, val).
Comme auparavant, il accepte un lien vers le fichier et une variable numérique comme arguments, et retourne un code d'erreur.
La fonction va lire 2 octets à partir du fichier si la variable passée en paramètre est déclarée comme int, et lire 4 octets si la variable est de type long. Les variables de type bool peuvent aussi être lues et écrites de la même façon.
#define INT // INT or LONG
#ifdef INT
task main () {
byte handle, time = 0;
int n, fsize,len, i;
int in;
DeleteFile("int.txt");
CreateFile("int.txt",4096,handle);
for (int i = 1000; i<=10000; i+=1000){
WriteLn(handle,i);
}
CloseFile(handle);
OpenFileRead("int.txt",fsize,handle);
until (ReadLn(handle,in)!=NO_ERR){
ClearScreen();
NumOut(30,LCD_LINE5,in);
Wait(500);
}
CloseFile(handle);
}
#endif
#ifdef LONG
task main () {
byte handle, time = 0;
int n, fsize,len, i;
long in;
DeleteFile("long.txt");
CreateFile("long.txt",4096,handle);
for (long i = 100000; i<=1000000; i+=50000){
WriteLn(handle,i);
}
CloseFile(handle);
OpenFileRead("long.txt",fsize,handle);
until (ReadLn(handle,in)!=NO_ERR){
ClearScreen();
NumOut(30,LCD_LINE5,in);
Wait(500);
}
CloseFile(handle);
}
#endif
Dostları ilə paylaş: |