Dosyalarla çalışma. - sayfa 4

 

TheXpert :

AMAN TANRIM! Sonucun genellikle delilik olduğu yer. Bu şekilde "OOP daha hızlı" veya "göstergeler yavaş, tüm kodu bir Expert Advisor'a aktarmanız gerekiyor" gibi uygulamalar daha sonra çıkıyor.

Evet, her şeyin istendiği gibi çalışmadığını anlıyorum, en azından FileFlush()'ın normal kullanımı FileClose()'dan belirgin şekilde daha hızlı olmalıdır.

Ancak şimdi bana öyle geliyor ki, bu tür şeyleri döngüye sokmaya değmez, her durumda çok yardımcı olmaz.

Ve MQL4 örneğini doğru anladıysam, FileFlush() çağrısı iki döngü arasında yer alıyor (bu da beni bunun tam olarak döngüdeki fren olduğu fikrine götürdü).

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

Bu nedenle, geliştiricilerin mantığını doğru anlarsam , dosyayı ana sınıfın OnInit / Constructor'ında açmanız (muhtemelen sadece yapıcıda değil), ana sınıfın OnDeint / Destructive içinde kapatmanız gerekir.

Diğer tüm durumlarda, FileClose yerine FileFlush kullanırız ( FileWrite ve döngülerden sonra ).


 

TheXpert :

Yedelkin :

Aynı zamanda, belgelere göre satırları değiştirdim:

         FileFlush (handle_file);
         FileWrite (handle_file,t);

Bu belgelerde nerede yazıyor?

MQL5 Referansında böyle bir ifade var:

FileFlush

Not

Dosyadan okuma ve dosyaya yazma arasında FileFlush() işlevi çağrılmalıdır.

"Bir dosyaya yazma" == FileWrite() işlevi ise, şunu okuruz: " FileFlush() işlevi, FileWrite() işlevinden önce çağrılmalıdır." Yoksa farklı bir fikriniz mi var?

TheXpert :

Yedelkin :
Ama FileFlush()'ı FileWrite()'dan önce çağırmanın amacını henüz çözemedim.

Ona sahip olmayan bir şeyin anlamını nasıl anlayabilirsiniz? Hatların sırasını anavatanlarına iade edin ve iki kez kontrol edin. Görünüşe göre belgeler pek doğru değil.

Yeni materyali incelerken neyin mantıklı neyin anlamsız olduğunu önceden bilmek iyidir. Doğa bizi böyle yeteneklerle ödüllendirmediği için, "her yeni zirveyi savaşarak almak", test etmek, belgeleri ve sonuçları yorumlamak zorundayız. Testlerin kendilerinin doğru yazıldığından bile emin değilim. İlk başta sezgisel olarak FileFlush ()'ı FileWrite ()'den sonra koydum, ancak Dizini yeniden okuduktan sonra bu örneği sildim.

TheXpert :

ilginç :

AMAN TANRIM! Sonucun genellikle delilik olduğu yer. Bu şekilde "OOP daha hızlı" veya "göstergeler yavaş, tüm kodu bir Expert Advisor'a aktarmanız gerekiyor" gibi uygulamalar daha sonra çıkıyor.

Her değerlendirmeden sonra "Sonuçunuz delilik" bu çılgınlığın ne olduğuna dair bir açıklama olsaydı harika olurdu :)

 
TheXpert :

Değişiklikleri görünmeden önce yanıp sönmenin bir anlamı yoktur. onlar henüz yok :)

İnanmayın ama ondan önceki belgelere atıfta bulunarak "Ama FileFlush() 'ı FileWrite() 'dan önce çağırmanın amacını henüz anlamadım" yazmamın nedeni buydu . Ancak her belge satırını sorgulamak - küstahlık ve bilgi henüz yeterli değil :)
... Genel olarak, kurs açıktır - belirli bir sorun gerçekten keşfedilirse geliştiricilerin ne söyleyeceğini bekliyoruz.
 
Yedelkin :

MQL5 Referansında böyle bir ifade var:

"Bir dosyaya yazma" == FileWrite() işlevi ise, şunu okuruz: " FileFlush() işlevi, FileWrite() işlevinden önce çağrılmalıdır." Yoksa farklı bir fikriniz mi var?

MQL4 için bu fonksiyonun "oldukça kötü şans" açıklamasını ve örneğini inceleyelim.

geçersiz FileFlush ( int tutamaç)


G/Ç dosya arabelleğinde kalan tüm verilerin diske boşaltılması.

Notlar: Dosyadan okuma ve dosyaya yazma arasında FileFlush() işlevi çağrılmalıdır.
Bir dosyayı kapatmak, verileri otomatik olarak diske boşaltır, bu nedenle FileClose() işlevini çağırmadan önce FileFlush( ) işlevini çağırmaya gerek yoktur.

Burada vurgulanan satır, bir dosyaya yazmadan önce bir döngüde FileFlush'a bir çağrı koyma ihtiyacının bir argümanı olarak tarafınızca verilmiştir.

Ancak bu açıklamayı harfi harfine alırsak, şunu elde ederiz:

FileFlush() işlevi , bir dosyadan okuma (ve okuma, FileReadXXX olarak bilinir) ve bir dosyaya yazma (FileWrite ve FileWriteXXX, yazma ile ilişkilendirilir) işlemleri arasında çağrılmalıdır.

Dosya kapatıldığında (okuduk - FileClose yürütüldüğünde) , veriler otomatik olarak diske boşaltılır (okuruz - FileFlush otomatik olarak gerçekleştirilir).


Bence geliştiriciler, MQL4 sürümünde bile yardımın doğru okunmasını pek umursamadılar, kesilen kısmı MQL5'e aktarmaktan bahsetmek saçma.

En azından burada verilen açıklamadaki ikinci cümle bence şöyle görünmelidir:

Veriler, dosya kapatılmadan önce otomatik olarak diske aktarılır, bu nedenle FileClose() işlevini çağırmadan önce FileFlush( ) işlevini çağırmaya gerek yoktur.

Bu aynı zamanda biraz özensiz, ancak belirli bir bakış açısından, dosyayı FileClose ile kapatmadan önce neden FileFlush kullanmamanız gerektiğini daha açık bir şekilde açıklıyor.


Bir örnekle de, her şey o kadar basit değil, metin bir şey hakkında yazılmıştır (okuma ve yazma işlemleri arasında kullanım) ve örnek iki yazma döngüsü arasındaki kullanımı açıklar (bu arada döngüler içinde çalışma dikkate alınmaz) yardımın içinde).

Bu nedenle, en azından aşağıdakileri eklemeniz gerekir:

1. Bu G/Ç arabelleğinin ne olduğunun ve bir dosyanın açılması, bir veri bloğunun okunması, bir veri bloğunun yazılması ve bir dosyanın kapatılması arasında gerçekte ne olduğunun bir açıklaması.

Büyük olasılıkla bu, dosya işlemleriyle ilgili bölümün tamamı için geçerlidir.

2. Bir dosyaya bir kez erişirken (örneğin, bir zamanlayıcıya bir değer yazarken) FileFlush çağrısının nasıl doğru şekilde kullanılacağına dair normal olarak anlaşılan bir örnek verin (bir sınıfa dayalı olabilir).

3 Dizilerle çalışırken normal bir çağrı örneği verin. Anladığım kadarıyla, MQL4'te açıklanan örnek, büyük dizilerle çalışmaya yardımcı oluyor, ancak bunu yanlış gösteriyor (tek kelimeyle, birkaç kez yapılabiliyorsa neden aynı verinin oldukça büyük bir miktarını bir dosyaya iki kez yazın? ?).

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

Burada vurgulanan satır, bir dosyaya yazmadan önce bir döngüde FileFlush'a bir çağrı koyma ihtiyacının bir argümanı olarak tarafınızca verilmiştir.

Ancak bu açıklamayı harfi harfine alırsak, şunu elde ederiz:

FileFlush() işlevi , bir dosyadan okuma (ve okuma, FileReadXXX olarak bilinir) ve bir dosyaya yazma (FileWrite ve FileWriteXXX, yazma ile ilişkilendirilir) işlemleri arasında çağrılmalıdır.

Dosya kapatıldığında (okuduk - FileClose yürütüldüğünde) , veriler otomatik olarak diske boşaltılır (okuruz - FileFlush otomatik olarak gerçekleştirilir).

Düşünce trenini anladım. Cehaletten, "bir dosyadan okuma" işlemini FileOpen() işleviyle eşitlediğimi itiraf ediyorum (EA'm keneleri ve kullanıcı olaylarını işlerken yalnızca OnInit()'ten okuyacak - yalnızca yaz; bu nedenle işlevler döngüdeki FileReadXXX() türü dikkate alınmadı). Ancak FileFlush(), FileWriteXXX()'den önce - prensip her iki referans kitabında da aynıdır. ..Evet ve klasik anlamda bir argüman değil (benim pozisyonumu haklı çıkarmak için), sadece neden bu cümleyi korkuyla yazdığım sorusuna bir cevaptı.

Genel olarak, geliştiriciler burada cevap vermezse, akşamları tartışma ve ara sonuçlara bağlantı içeren bir istek yazacağım. Hatta iki uygulamaya ihtiyaç vardır: 1) "hata, hata değildir" ve 2) belgelerde değişiklik. Konuyu bu kadar derine kazdığınız için ikinci başvuruyu kendiniz mi doldurmak istiyorsunuz?

 
Yedelkin :

Düşünce trenini anladım. Cehaletten, "bir dosyadan okuma" işlemini FileOpen() işleviyle eşitlediğimi itiraf ediyorum (EA'm keneleri ve kullanıcı olaylarını işlerken yalnızca OnInit()'ten okuyacak - yalnızca yaz; bu nedenle işlevler döngüdeki FileReadXXX() türü dikkate alınmadı). Ancak FileFlush(), FileWriteXXX()'den önce - prensip her iki referans kitabında da aynıdır. ..Evet ve bu klasik anlamda bir argüman değildi (benim pozisyonumu haklı çıkarmak için), sadece bu cümleyi neden korkuyla yazdığım sorusuna bir cevaptı.

Genel olarak, geliştiriciler burada cevap vermezse, akşamları tartışma ve ara sonuçlara bağlantı içeren bir istek yazacağım. Hatta iki uygulamaya ihtiyaç vardır: 1) "hata, hata değildir" ve 2) belgelerde değişiklik. Konuyu bu kadar derine kazdığınız için ikinci başvuruyu kendiniz mi doldurmak istiyorsunuz?

1. Gerçekten derin mi? Geliştiricilerin ne söylemek istediğini ve nerede olduğunu anlasaydım tükürmekten mutluluk duyardım.

Ve bazen şöyle ortaya çıkıyor: G / Ç arabelleğinden söz ediliyor, ancak bunun için normal bir açıklama yok. Yoksa buradaki herkes DOSYA G/Ç BUFFER'ın ne olduğunu biliyor mu?

Dosya işlemleri bölümüne bu konunun normal bir açıklamasını eklemek gerçekten zor mu? Yoksa artık geliştiricilerin neyi ve nasıl amaçladığına dair bir cevap aramak için google'a gitmeye gerek yok mu?

Referansın boyutunun sınırlı olduğunu anlıyorum, ancak neden MQL'yi yeni öğrenmeye başlayanlarla alay edin?

2. Neden bu arabellekten en azından bir kısmını yalnızca bu işlevin yardımında bahsettim, neden dosya işlemleri bölümünde bundan başka bir yerde bahsedilmiyor?

3. Diyelim ki bunun gibi bir şeyde bu çok G / Ç arabelleği hakkında bir fikrim var

Dosya sistemiyle ilgili olarak, bir G/Ç arabelleği kavramıdır. Veri girişi ve çıkışı bu tampon üzerinden gerçekleştirilir.

Arabellek, bellekte her dosya için ayrılmış bir alandır .

Bir dosyaya yazarken, tüm bilgiler önce arabelleğe gönderilir ve tüm arabellek dolana kadar orada birikir. Ancak bundan sonra veya özel bir sıfırlama komutundan sonra (örneğin, FileClose veya FileFlush) , arabellekten dosyaya veri aktarımı olur.

Bir dosyadan okurken, veriler önce arabelleğe okunur ve veriler istendiği kadar değil, arabelleğe sığacağı kadar okunur.

Ve geliştiriciler, MQL'yi öğrenmeye başlayan yeni başlayanlar için ilgi çekici olabilecek tüm bilgilerin bu olduğuna ciddi olarak inanıyorlar (tabii ki, böyle bir tanım belirli bir dil için adil kabul edilemezse)?

Örneğin, şu soruya bir cevap almak benim için ilginç hale geldi - Bu tamponun kendisinin boyutu nedir ve nasıl belirlenir?

Bence, sadece bu değil, tüm bu bilgiler dil belgelerinde olmalıdır (tam olarak orada ve forumdaki çeşitli makalelerde ve tartışmalarda değil).

 
Interesting :
tamam kendim yazmaya çalışacağım
 

Komut dosyası neden dosyanın gerçek " Son Okuma Tarihi " döndürmüyor?

 int handle_file;
void OnStart ()
  {
   handle_file= FileOpen ( "Ye_file2.bin" , FILE_READ | FILE_WRITE | FILE_BIN );
    switch (handle_file)
     {
       case    INVALID_HANDLE : break ;
       default :
         Print ( "Дата создания файла Ye_file2.bin: " ,( datetime ) FileGetInteger (handle_file, FILE_CREATE_DATE ));
         for ( int i= 0 ;i< 3 ;i++)
           {
             Sleep ( 3000 );
             FileReadInteger (handle_file,CHAR_VALUE);
             Print ( "Дата последнего чтения Ye_file2.bin: " ,( datetime ) FileGetInteger (handle_file, FILE_ACCESS_DATE ));
           }
         FileClose (handle_file);
     }
  }
 
Yedelkin :

Komut dosyası neden dosyanın gerçek " Son Okuma Tarihi " döndürmüyor?

Son erişim ve okunmadı. Kolu tekrar açın ve daha mutlu olacaksınız.
 
TheXpert :
Son erişim ve okunmadı.

Tamam, fark etmiş olabileceğiniz gibi, sorumda tam anlamıyla belgelerdeki ifadeyi yeniden ürettim:

ENUM_FILE_PROPERTY_INTEGER

tanımlayıcı

Kimlik Açıklama

DOSYA VAR

varlık testi

FILE_CREATE_DATE

oluşturma tarihi

FILE_MODIFY_DATE

Son değiştirilme tarihi

FILE_ACCESS_DATE

Son okuma tarihi

Soru 1: Belgelerde bir yazım hatası olduğunu ve "Son okuma tarihi" yerine "Son açılış tarihi" gibi bir şey olması gerektiğini düşünüyor musunuz? En azından cevabınızdan, "dosya okuma" ve "dosyaya erişme" işlemlerinin sizin için anlamlarında farklı işlemler anlamına geldiği açıktır.

Daha ileri. Önceden eklenmiş komut dosyasını birkaç kez yeniden başlatırsanız, şu davranışa benzer bir şey görürsünüz:

FK       0        FileInteger (EURGBP,M1) 21 : 33 : 56         Дата создания файла Ye_file2.bin: 2011.09 . 03 21 : 22 : 25
IP       0        FileInteger (EURGBP,M1) 21 : 33 : 59         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 33 : 57
RL       0        FileInteger (EURGBP,M1) 21 : 34 : 02         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 33 : 57
NH       0        FileInteger (EURGBP,M1) 21 : 34 : 06          Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 33 : 57
MH       0        FileInteger (EURGBP,M1) 21 : 34 : 43         Дата создания файла Ye_file2.bin: 2011.09 . 03 21 : 22 : 25
EP       0        FileInteger (EURGBP,M1) 21 : 34 : 46         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 34 : 06
HL       0        FileInteger (EURGBP,M1) 21 : 34 : 50         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 34 : 06
IH       0        FileInteger (EURGBP,M1) 21 : 34 : 53         Дата последнего чтения Ye_file2.bin: 2011.09 . 03 21 : 34 : 06

Onlar. komut dosyası ilk kez çalıştırıldığında , 21 : 34: 06'da FileReadInteger() işlevine üçüncü çağrının gerçekleştiğini, ancak son okuma/erişim tarihi olarak başka bir zaman belirtildiğini, yani : 21:33: 57'yi alırız. . Ancak, betiğin ikinci (37 saniye sonra) başlatılmasında, FileReadInteger() işlevine yapılan ilk çağrının 21:34:06 saatini verdiğini , yani . önceki komut dosyası çalıştırmasında FileReadInteger() işlevine yapılan son çağrının zamanı.

Ek olarak, senaryonun ikinci çalışmasının yaklaşık 21:34: 43'te gerçekleştiği görülebilir, bu da aynı zamanda sizin deyiminizle “kolun yeniden açılması”nın gerçekleştiği anlamına gelir. Ancak böyle bir "sapın yeniden açılmasından " sonra 21:34:06 döndürülür, yani. kesinlikle bahsettiğin zaman değil.

Soru 2: nasıl yorumlanır?

TheXpert :
Kolu tekrar açın ve daha mutlu olacaksınız.

Mevcut durumda, tutamacı "yeniden açmadan" dosya özellikleri elde edildiğinde mutluluk beklenir.