FileSeek

Dosya işaretçisinin konumunu, belirtilen konuma göre, belirtilen bayt sayısı kadar taşır.

bool  FileSeek(
   int                  file_handle,     // Dosya tanıtıcı değeri
   long                 offset,          // Bayt
   ENUM_FILE_POSITION   origin           // Referans konumu
   );

Parametreler

file_handle

[in] FileOpen() fonksiyonunun dönüş yaptığı dosya tanımlayıcısı.

offset

[in] Bayt bazında kaydırma değeri (negatif değer alabilir).

origin

[in] Kaydırma için başlangıç konumu. ENUM_FILE_POSITION sayımının değerlerinden biri olabilir.

Dönüş değeri

Başarılı ise 'true' değerine, aksi durumda 'false' değerine dönüş yapar. Hata ile ilgili bilgi almak için GetLastError() fonksiyonunu çağırın.

Not

FileSeek() fonksiyonunun çalışması sonucunda negatif kaydırma değeri elde ediliyorsa (dosyanın "sol sınırı" dışına çıkılırsa), dosya işaretçisi dosyanın başlangıcına ayarlanır.

Eğer konum, "sağ sınırın" ötesine ayarlanmışsa (dosya boyutundan büyükse), bir sonraki dosya yazımı dosyanın sonundan değil, belirtilen konumdan başlar Bu durumda, dosyanın önceki sonu ile ayarlanan pozisyonu arasına boş değerler yazılacaktır.

Örnek:

//+------------------------------------------------------------------+
//|                                                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);
  }