//+------------------------------------------------------------------+
//| 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"
//--- script çalıştırıldığında giriş parametrelerinin penceresini göster
#property script_show_inputs
//--- giriş parametreleri
input string InpFileName="file.txt"; // dosya ismi
input string InpDirectoryName="Data"; // dizin ismi
input int InpEncodingType=FILE_ANSI; // ANSI=32 veya UNICODE=64
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- rassal sayıları oluşturmak için değişken değerini belirle
_RandomSeed=GetTickCount();
//--- dizgilerin başlangıç noktası konumları için değişkenler
ulong pos[];
int size;
//--- hata değerini sıfırla
ResetLastError();
//--- dosyayı aç
int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s dosyası, okuma için müsait",InpFileName);
//--- dosyadaki her bir dizgi için başlangıç konumu al
GetStringPositions(file_handle,pos);
//--- dosyadaki dizgilerin sayısını tanımla
size=ArraySize(pos);
if(!size)
{
//--- dosyada dizgi yoksa dur
PrintFormat("%s dosyası boş!",InpFileName);
FileClose(file_handle);
return;
}
//--- dizgi sayısını rassal olarak seç
int ind=MathRand()%size;
//--- konumu dizginin başlangıç noktasına kaydır
if(FileSeek(file_handle,pos[ind],SEEK_SET)==true)
{
//--- ind sayısı ile dizgiyi oku ve çıktıla
PrintFormat("%d numaralı dizgi metni: \"%s\"",ind,FileReadString(file_handle));
}
//--- dosyayı kapat
FileClose(file_handle);
PrintFormat("%s dosyası kapatıldı",InpFileName);
}
else
PrintFormat("%s dosyası açılamadı, Hata kodu = %d",InpFileName,GetLastError());
}
//+-------------------------------------------------------------------------------+
//| Bu fonksiyon, dosyadaki her dizgi için başlangıç konumları tanımlar |
//| ve bunları arr dizisine yerleştirir |
//+-------------------------------------------------------------------------------+
void GetStringPositions(const int handle,ulong &arr[])
{
//--- varsayılan dizi büyüklüğü
int def_size=127;
//--- dizi için bellek tahsis et
ArrayResize(arr,def_size);
//--- dizgi sayacı
int i=0;
//--- bu, dosyanın sonu değilse, hala en azından bir dizgi kalmıştır
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return; // dosya boş, çık
//--- kaydırmayı kodlama biçimine göre ve bayt bazında tanımla
int shift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- dizgileri döngü içinde incele
while(1)
{
//--- dizgiyi oku
FileReadString(handle);
//--- dosya sonunu kontrol et
if(!FileIsEnding(handle))
{
//--- bir sonraki dizginin konumunu kaydet
arr[i]=FileTell(handle)+shift;
i++;
//--- taşma varsa dizi büyüklüğünü artır
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break; // dosyanın sonuna gelindi, çık
}
//--- dizinin gerçek büyüklüğünü tanımla
ArrayResize(arr,i);
}
|