Dosyalarla çalışma. - sayfa 2

 
mql5 :
MQL'deki dizeler unicode'dur (karakter başına 2 bayt), kernel32.dll işlevleri ise ansidiktir (karakter başına 1 bayt). Bir bayt dizisi kullanın ve Ansic işlevlerini çağırmak için StringToCharArray işlevi
Nasıl yani?
Hatırladığım kadarıyla, Windows neredeyse tamamen Unicode ve uzun süredir ...

Yoksa kernel32 .dll bir istisna mı?

-----Katma------

Baktım, gerçekten ansi, tuhaf...

 

Bir amatöre söyle. Dosyalarla çalışma bilgisi - Word kullanıcısı düzeyinde.

Expert Advisor'ın tüm çalışma süresi boyunca, dosyanın başına kadar her seferinde dosyaya datetime türünden bir değerin üzerine yazılması gerekir. Son kaydedilen değeri okuyun - yalnızca Expert Advisor yeniden yüklendiğinde. Bir .csv dosyası kullanarak basit bir tasarım çizdim - her şey çalışıyor gibi görünüyor. Aşağıdaki sorular ortaya çıktı:

1) Yazma prosedürünün yürütme süresini en aza indirmek için tarih saat değerlerini depolamak için kullanılacak en iyi dosya türü nedir? Anladığım kadarıyla, .csv dosyaları dizelerle çalışır ve dizelerin olduğu yerde onları işlemek için harcanan ek bir zaman vardır.

2) FileClose() işlevi nasıl doğru şekilde kullanılır: Dosyaya yeni bir değer yazdıktan sonra her seferinde dosyayı kapatın veya OnDeinit() işlevinde dosyayı bir kez kapatın? Dosyayı bir kez açıp, birden fazla açılıp kapanmasıyla zaman kaybetmeden sadece yeni değerler yazmak istiyorum. Ama bunu yapmak tehlikeli değil mi?

3) Bir dosyaya belirli bir değer yazılırsa ancak dosya kapatılmazsa, aniden güç kesilirse, bu yazılan değerin hiçbir yere gitmeyeceğini ve program yüklendiğinde, bu değerin bir yere gitmeyeceğini doğru anlıyor muyum? daha sonra okunacak mı?

 

Yedelkin :

Aşağıdaki sorular ortaya çıktı:

1) Yazma prosedürünün yürütme süresini en aza indirmek için tarih saat değerlerini depolamak için kullanılacak en iyi dosya türü nedir? Anladığım kadarıyla, .csv dosyaları dizelerle çalışır ve dizelerin olduğu yerde bunları işlemek için harcanan ek bir zaman vardır.

2) FileClose() işlevi nasıl doğru şekilde kullanılır: Dosyaya yeni bir değer yazdıktan sonra her seferinde dosyayı kapatın veya OnDeinit() işlevinde dosyayı bir kez kapatın? Dosyayı bir kez açıp birden fazla açılıp kapanmasıyla zaman kaybetmeden sadece yeni değerler yazmak istiyorum. Ama bunu yapmak tehlikeli değil mi?

3) Bir dosyaya belirli bir değer yazılırsa ancak dosya kapatılmazsa, aniden güç kesilirse, bu yazılan değerin hiçbir yere gitmeyeceğini ve program yüklendiğinde, bu değerin bir yere gitmeyeceğini doğru anlıyor muyum? daha sonra okunacak mı?

1. Hangi formatın kaydedileceğine bağlı olarak. Tarih şu şekilde saklanabilir: sayı, metin veya özel tarih saat türü.

İkinci soru şu olacak - Dosyaya neden yazıyoruz, kim ve nasıl görüntüleyecek?

TXT'ye yazmak muhtemelen en kolay ve en güvenilir seçenektir (bunu herhangi bir programdan veya neredeyse herhangi birinden okuyabilirsiniz), CSV bir . Artıları var, ancak bazı eksileri var.

2. OnInit'te veya ana sınıfın kurucusunda (uygulamaya bağlı olarak) bir kez açmayı ve onu OnDeinit'te veya yıkıcıda kapatmayı tercih ediyorum.

Ancak dosyayı yeniden açma / yeniden açma ihtiyacı varsa (bu tür eylemlerin birkaç nedeni vardır), bunu periyodik olarak (saatte / günde / haftada bir) yapabilirsiniz.

Dosya büyükse veya içindeki bilgilerin kurtarılması zorsa, periyodik olarak üzerine yazmak veya yeni bir tane oluşturmak daha iyidir.

3. Değer yazılmışsa, ancak dosya doğru kapatılmamışsa (ani elektrik kesintisi veya yazılımın donması), büyük olasılıkla veriler kaybolacaktır (kısmen veya tamamen ayrı bir sorun).

Delphi'de yazılmış programda normal txt'de kayıt denemesi yaptığım hatırlıyorum. Yani orada, sorun olması durumunda, son rekor genellikle dövüldü veya eksikti.

 

Son dosya değişikliğinin zamanını döndüren bir mql işlevine sahip olmayı çok isterim.

 datetime FileLastModificationTime( string FName);
 
MetaDriver :

Son dosya değişikliğinin zamanını döndüren bir mql işlevine sahip olmayı çok isterim.

 datetime FileLastModificationTime( string FName); 
Genel olarak, - bir şairin rüyası!
 
Interesting :

1. Bir tarih şu şekilde saklanabilir: sayı, metin veya özel tarih saat türü.

Burada tarihi datetime türü olarak kaydeden bir işlev bulamadım. Sadece diziler aracılığıyla.

Bazı nedenlerden dolayı, tarih saat değerlerini ikili bir dosyaya kaydetmenin daha iyi olacağı görülüyor (dosyanın kendisi yalnızca yeniden yükleme sırasında aynı Uzman Danışman tarafından okunması amaçlanıyor). Denemeye çalışacağım.

ilginç :

3. Değer yazılmışsa, ancak dosya doğru kapatılmamışsa (ani elektrik kesintisi veya yazılımın donması), büyük olasılıkla veriler kaybolacaktır (kısmen veya tamamen ayrı bir sorun).

Delphi'de yazılmış programda normal txt'de kayıt denemesi yaptığım hatırlıyorum. Yani orada, sorun olması durumunda, son rekor genellikle dövüldü veya eksikti.

Ne yazık ki. Son kaydedilen değeri garantili tutmak istiyorsanız, her zaman FileClose() işlevini kullanın :(

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

Ne yazık ki. Son kaydedilen değeri garantili tutmak istiyorsanız, her zaman FileClose() işlevini kullanın :(

FileFlush() bunun için icat edildi.
 

sergeev :

Yedelkin :

Ne yazık ki. Son kaydedilen değeri garantili tutmak istiyorsanız, her zaman FileClose() işlevini kullanın :(

FileFlush() bunun için icat edildi.

Belki. Sadece nasıl kullanılacağı (hangi durumlarda başvurulacağı) - hiçbir şey söylenmez. Belki profesyoneller için bu kolay bir sorudur, ancak kişisel olarak, belgeleri okuduktan sonra FileFlush'ta () herhangi bir özel anlam yakalamadım ...

Ve FileClose() ve FileFlush() arasındaki fark hala net değil :/

FileFlush

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

... Dosya okuma ve dosya yazma işlemleri arasında FileFlush() işlevi çağrılmalıdır.

Olan bu, henüz dosyaya yazma yok, ancak veriler zaten bir yerde "diske atıldı" mı?

 
Yedelkin :

Belki. Sadece nasıl kullanılacağı (hangi durumlarda başvurulacağı) - hiçbir şey söylenmez. Belki profesyoneller için bu kolay bir sorudur, ancak kişisel olarak, belgeleri okuduktan sonra FileFlush'ta () herhangi bir özel anlam yakalamadım ...

Ve FileClose() ve FileFlush() arasındaki fark hala net değil :/

Olan bu, henüz dosyaya yazma yok, ancak veriler zaten bir yerde "diske atıldı" mı?

Burada, MQL4 Yardımından bir örnekle daha ayrıntılı bir açıklama verilmiştir.

geçersiz FileFlush ( int tutamaç)


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

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.
Seçenekler:
üstesinden gelmek - FileOpen() işlevi tarafından döndürülen dosya tanıtıcısı.

Misal:

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

Her şeyi doğru anladıysam, FileClose'un aksine, FileFlush çağrısı dosyayı kapatmaz, bu da dosya ile çalışmaya devam etmenizi sağlar. Evet ve yeniden açılma ile karşılaştırıldığında, hızda önemli bir artış elde edilmelidir.

Her ne kadar burada görevin daha spesifik bir örneğine ihtiyacımız var.

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

Burada, MQL4 Yardımından bir örnekle daha ayrıntılı bir açıklama verilmiştir.

"Bir dosya kapatıldığında, veriler otomatik olarak diske aktarılır, bu nedenle FileClose() işlevini çağırmadan önce FileFlush() işlevini çağırmaya gerek yoktur" - Evet, Sergeev'in neden bahsettiğini anlamaya başlıyorum. Dosyadaki son kaydın korunmasını garanti etmek için FileClose() yerine FileFlush()? Ve bu akıllıca bir karar olur mu?