//+------------------------------------------------------------------+
//| Demo_FileSeek.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//--- montrons la fenêtre des paramètres d'entrée au lancement du script
#property script_show_inputs
//--- les paramètres d'entrée
input string InpFileName="file.txt"; // le nom du fichier
input string InpDirectoryName="Data"; // le nom du répertoire
input int InpEncodingType=FILE_ANSI; // ANSI=32 ou UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- établissons la valeur de la variable pour la génération des nombres accidentels
_RandomSeed=GetTickCount();
//--- les variables pour les positions du début des chaînes
ulong pos[];
int size;
//--- oblitérons la valeur de l'erreur
ResetLastError();
//--- ouvrons le fichier
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("Le fichier %s est ouvert pour la lecture",InpFileName);
//--- recevrons la position du début pour chaque chaîne dans le fichier
GetStringPositions(file_handle,pos);
//--- définissons le nombre de chaînes dans le fichier
size=ArraySize(pos);
if(!size)
{
//--- S'il n'y a pas de chaînes dans le fichier, terminons le travail
PrintFormat("Le fichier %s est vide!",InpFileName);
FileClose(file_handle);
return;
}
//--- choisirons le numéro de chaîne par hasard
int ind=MathRand()%size;
//--- déplaçons la position au début de cette chaîne
if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
{
//--- lisons et imprimons la chaîne avec le numéro ind
PrintFormat("Le texte de la chaîne avec le numéro %d: \"%s\"",ind,FileReadString(file_handle));
}
//--- fermons le fichier
FileClose(file_handle);
PrintFormat("Le fichier %s est fermé",InpFileName);
}
else
PrintFormat("On n' a pas réussi à ouvrir le fichier %s, le code de l'erreur = %d",InpFileName,GetLastError());
}
//+------------------------------------------------------------------+
//| La fonction définit les positions du début pour chacune des chaînes dans le fichier et |
//| les place dans un tableau arr |
//+------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
//--- la taille du tableau par défaut
int def_size=127;
//--- allouons la mémoire pour le tableau
ArrayResize(arr,def_size);
//--- le compteur des chaînes
int i=0;
//--- s'il n'y a pas de la fin du fichier, il y a quand même une chaîne
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return; // le fichier est vide, sortons
//--- définissons le décalage en octets en fonction de l'encodage
int shift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- trions les chaînes dans le cycle
while(1)
{
//--- lisons la chaîne
FileReadString(handle);
//--- la vérification à la fin du fichier
if(!FileIsEnding(handle))
{
//--- retiendrons la position de la chaîne suivante
arr[i]=FileTell(handle)+shift;
i++;
//---augmentons la taille du tableau, s'il est rempli
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break; // la fin du fichier, sortons
}
//---établissons la taille véritable du tableau
ArrayResize(arr,i);
}
|