Travailler avec des fichiers. - page 2

 
mql5:
Les chaînes de caractères dans MQL sont unicode (2 octets par caractère) et les fonctions de kernel32.dll sont ansi (1 octet par caractère). Utilisez un tableau d'octets et la fonction StringToCharArray pour appeler les fonctions ansish.
Comment cela ?
Si je me souviens bien, Windows est presque entièrement Unicode, et ce depuis longtemps...

Ou est-ce que kernel32.dll est une exception ?

-----Added------

Je l'ai regardé, vraiment ansi, étrange...

 

Un conseil à un amateur. Ma connaissance du travail avec les fichiers est du niveau d'un utilisateur de Word.

Le conseiller expert doit écraser une valeur de type date dans le fichier, chaque fois au début du fichier, pendant toute la durée de son travail. Lire la dernière valeur écrite - uniquement lors du redémarrage de l'Expert Advisor. J'ai fait une construction simple, en utilisant le fichier .csv - tout semble fonctionner. Les questions suivantes sont apparues :

1) Quel type de fichier est-il préférable d'utiliser pour sauvegarder les valeurs de date afin de minimiser le temps d'écriture de la procédure ? Si j'ai bien compris, les fichiers .csv fonctionnent avec des chaînes de caractères, et lorsqu'il y a des chaînes de caractères, il y a une consommation de temps supplémentaire pour leur traitement.

2) Comment utiliser correctement FileClose() : dois-je fermer le fichier chaque fois après y avoir écrit une nouvelle valeur, ou le fermer une fois, dans la fonction OnDeinit() ? J'aimerais ouvrir le fichier une fois, puis y inscrire de nouvelles valeurs, sans perdre de temps à l'ouvrir et à le fermer plusieurs fois. Mais est-il sûr de le faire ?

3) Ai-je bien compris que si une certaine valeur est écrite dans le fichier, mais que le fichier n'est pas fermé, alors en cas de coupure de courant soudaine, cette valeur écrite ne disparaîtra pas, et lorsque le programme sera chargé, il sera possible de la lire plus tard ?

 

Yedelkin:

Les questions suivantes ont été soulevées :

1) Quel type de fichier est-il préférable d'utiliser pour sauvegarder des valeurs de date afin de minimiser le temps de la procédure d'écriture ? Si j'ai bien compris, les fichiers .csv fonctionnent avec des chaînes de caractères, et lorsqu'il y a des chaînes de caractères, il y a une consommation de temps supplémentaire pour leur traitement.

2) Comment utiliser correctement FileClose() : dois-je fermer le fichier chaque fois après y avoir écrit une nouvelle valeur, ou le fermer une fois, dans la fonction OnDeinit() ? J'aimerais ouvrir le fichier une fois, puis y inscrire de nouvelles valeurs, sans perdre de temps à l'ouvrir et à le fermer plusieurs fois. Mais est-il sûr de le faire ?

3) Ai-je bien compris que si une certaine valeur est écrite dans le fichier, mais que le fichier n'est pas fermé, alors en cas de coupure de courant soudaine, cette valeur écrite ne disparaîtra pas, et lorsque le programme sera chargé, il sera possible de la lire plus tard ?

1. Cela dépend du format dans lequel le fichier est enregistré. Vous pouvez enregistrer la date sous forme de nombre, de texte ou de type spécialisé datetime.

La deuxième question serait la suivante : pourquoi l'enregistrer dans un fichier, qui va le consulter et comment ?

L'écriture au format TXT serait l'option la plus simple et la plus fiable (vous pouvez le lire à partir de n'importe quel programme, ou presque), CSV est un moyen plus avancé d'écrire dans un fichier. Il y a des avantages, mais aussi des inconvénients certains.

2. Je préfère ouvrir une fois dans OnInit ou le constructeur de la classe principale (dépend de l'implémentation) et fermer dans OnDeinit ou dans le destructeur.

Mais s'il est nécessaire de rouvrir le fichier (il existe un certain nombre de raisons pour de telles actions), vous pouvez le faire périodiquement (une fois par heure/jour/semaine).

Si le fichier est volumineux ou si les informations qu'il contient sont difficiles à restaurer, il est préférable de l'écraser périodiquement ou d'en créer un nouveau.

3. si la valeur a été écrite mais que le fichier n'est pas fermé correctement (coupure de courant soudaine ou blocage du logiciel), il est fort probable que les données seront perdues (partiellement ou complètement, c'est une autre question).

Je me souviens d'avoir expérimenté l'écriture en texte brut dans un programme écrit en Delphi. En cas de problème, le dernier enregistrement était souvent battu ou manquant.

 

Une fonction mql retournant l'heure de la dernière modification du fichier serait la bienvenue.

datetime FileLastModificationTime(string FName);
 
MetaDriver:

Une fonction mql retournant l'heure de la dernière modification du fichier serait la bienvenue.

datetime FileLastModificationTime(string FName); 
En général - le rêve d'un poète !
 
Interesting:

1. la date peut être enregistrée sous forme de : nombre, texte ou type de date.

Je n'ai pas trouvé de fonction permettant d'enregistrer la date en tant que type datetime. Si seulement à travers des tableaux.

Pour une raison quelconque, il semble qu'il serait préférable de stocker les valeurs de type date-heure dans un fichier binaire (le fichier lui-même est conçu pour être lu uniquement par le même conseiller expert lors du rechargement). Je vais essayer d'expérimenter.

Intéressant:

Si une valeur a été écrite, mais que le fichier n'a pas été fermé correctement (coupure de courant soudaine ou blocage du logiciel), il est fort probable que les données seront perdues (partiellement ou complètement, c'est une autre question).

Je me souviens avoir expérimenté l'écriture en texte brut dans un programme écrit en Delphi. En cas de problème, le dernier enregistrement était souvent battu ou manquant.

C'est dommage. Il s'avère que si vous voulez garantir la sauvegarde de la dernière valeur, vous devez utiliser la fonction FileClose() en permanence :(

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип datetime - Документация по MQL5
 
Yedelkin:

C'est dommage. Il s'avère que si vous voulez vous assurer que la dernière valeur écrite est sauvegardée, vous devez utiliser FileClose() tout le temps :(

FileFlush() a été inventé dans ce but.
 

sergeev:

Yedelkin:

C'est dommage. Il s'avère que si vous voulez être sûr de sauvegarder la dernière valeur que vous avez écrite, vous devez utiliser FileClose() en permanence :(

FileFlush() a été inventé dans ce but.

C'est possible. Mais il ne dit rien sur la manière de l'utiliser (quand l'utiliser). C'est peut-être une question facile pour un pro, mais personnellement je n'ai pas vu de sens particulier à FileFlush() après avoir lu la documentation...

Et la différence entre FileClose() et FileFlush() n'est toujours pas claire :/

FileFlush

Réinitialise sur disque toutes les données restantes dans le tampon d'E/S du fichier.

...FileFlush() doit être appelé entre les opérations de lecture et d'écriture de fichiers.

Donc, il n'y a pas d'écriture dans le fichier et les données sont déjà "vidées sur le disque" quelque part ?

 
Yedelkin:

C'est possible. Mais il ne dit pas comment l'utiliser (quand l'utiliser). C'est peut-être une question facile pour un pro, mais personnellement, après avoir lu la documentation, je ne vois pas de sens particulier à FileFlush()...

Et la différence entre FileClose() et FileFlush() n'est toujours pas claire :/

Donc, il n'y a pas d'écriture dans le fichier, mais les données sont déjà "vidées" quelque part ?

Voici une description plus détaillée et un exemple tiré de la Référence MQL4

void FileFlush( int handle)


Réinitialise sur le disque toutes les données restantes dans le tampon d'E/S du fichier.

Note : FileFlush() doit être appelé entre les opérations de lecture et d'écriture de fichiers.
Lorsqu'un fichier est fermé, les données sont automatiquement réinitialisées sur le disque, il n'est donc pas nécessaire d'appeler FileFlush() avant d'appeler FileClose().
Paramètres :
poignée - Le descripteur de fichier renvoyé par FileOpen().

Exemple :

int bars_count=Bars;
int handle=FileOpen("mydat.csv",FILE_CSV|FILE_WRITE);
  
  if(handle>0)
    {
     FileWrite(handle, "#","OPEN","CLOSE","HIGH","LOW");
     for(int i=0;i<bars_count;i++)
       FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
     FileFlush(handle);
     ...
     for(int i=0;i<bars_count;i++)
       FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
     FileClose(handle);
    }

Si j'ai bien compris, l'appel FileFlush, contrairement à FileClose, ne ferme pas le fichier, ce qui permet de continuer à travailler avec lui. Et par rapport à la réouverture, vous devriez obtenir une augmentation significative de la vitesse.

Bien que vous ayez besoin d'un exemple plus spécifique de la tâche à accomplir.

FileFlush - Документация на MQL4
  • docs.mql4.com
FileFlush - Документация на MQL4
 
Interesting:

Voici une description plus détaillée avec un exemple, tirée de l'aide de MQL4

"Lors de la fermeture du fichier, les données sont automatiquement réinitialisées sur le disque, il n'est donc pas nécessaire d'appeler FileFlush() avant d'appeler FileClose()" - Oui, oui, je commence à voir ce dont parlaitsergeev. Il s'avère donc qu'au lieu de FileClose(), vous pouvez appeler FileFlush() pour garantir la sauvegarde du dernier enregistrement dans le fichier ? Et ce serait une solution compétente ?