Yeni bir satırda bir dosyaya yazma - sayfa 3

 
Alexey Viktorov :

Ve konsept yüzeyde tam size göre………

"Kendi başınıza deneme" önerisinin (kavramının) seslendirme gerektirmediğini kastetmiştim, bu zaten açık. Igor'u çok iyi anladım ve en basit olduğu için bu seçeneği kendim düşündüm, ancak IMHO yukarıda açıklanan koşullara göre bana pek uymuyor.

 
EfremovSergey :

İşin püf noktası: Programlar var - bir dosyaya yazan 10 parça ve ondan okuyan 10 parça daha var, her okuma programının her seferinde birikmiş tüm veri dizisini işlemesini istemiyorum.

Bu durumda, dosyayı terk etmek ve SQLite veritabanıyla çalışmak genellikle daha iyidir. Bu, dosyalarla çalışmaya çok benzer, paylaşılan bir klasörde de oluşturulabilir, ancak bir satırı işlemek, aramak ve silmek çok daha kolaydır.

 

Sergey, bu dosyaya gözlerinle bakman gerekmiyorsa, bir kerede bir dizi veriyi içine yaz.

 int eHandle= FileOpen (eFileName, FILE_BIN | FILE_WRITE );
if (eHandle!= INVALID_HANDLE )
   {
   //сначала записываем размер массива
   FileWriteInteger (eHandle, ArraySize (eArray), INT_VALUE );
   //выгружаем данные из массива в файл
   FileWriteArray (eHandle,eArray, 0 , WHOLE_ARRAY );
   FileClose (eHandle);
   }

daha sonra herhangi bir zamanda diziyi dosyadan çıkarın

 if ( FileIsExist (eFileName))
   {
   eHandle= FileOpen (eFileName, FILE_BIN | FILE_READ );
   if (eHandle!= INVALID_HANDLE )
      {
       //сначала читаем и устанавливаем размер массива
       ArrayResize (eArray, FileReadInteger (eHandle, INT_VALUE ));
       //затем выгружаем данные из файла в массив
       FileReadArray (eHandle,eArray, 0 , WHOLE_ARRAY );
       FileClose (eHandle);
      }
   }

Ve diziyle istediğiniz gibi çalışın. Son elemanı silin, ekleyin.

 
Alexey Viktorov :

Ve bu durumda, dosyayı terk etmek ve SQLite veritabanıyla çalışmak genellikle daha iyidir. Bu, dosyalarla çalışmaya çok benzer, paylaşılan bir klasörde de oluşturulabilir, ancak bir satırı işlemek, aramak ve silmek çok daha kolaydır.

Peki MQL4 SQLite ile çalışmayı destekliyor mu, sadece TXT ve CSV formatı mı var?

Dosyaya sembolik bir bağlantı üzerinden erişiyorum, dosyanın nerede, hangi klasörde olduğu önemli değil.

 
Aleksei Stepanenko :

Sergey, bu dosyaya gözlerinle bakman gerekmiyorsa, bir kerede bir dizi veriyi içine yaz.

daha sonra herhangi bir zamanda diziyi dosyadan çıkarın

Ve diziyle istediğiniz gibi çalışın. Son elemanı silin, ekleyin.

Peki fark nedir, her durumda, dizi dosyaya satır satır yazılır veya bu durumda en azından son veya ilk öğeyi silmek mümkün müdür, dizi=satır?

 

Soruyu pek anlamadım. Üzerinde herhangi bir manipülasyonu kolaylıkla gerçekleştirebileceğiniz bir dizi veriye sahipsiniz. Ve bir dosyadan dört satır kodla basit yazma ve okuma. Bu avantaj. Bir dosyada dizi yazımı düzenlenirken ne yansıtılmalı?

Dizide gerekli değişiklikleri yaptık, değiştirilen diziyi bir dosyaya yükledik, o kadar.

 
Aleksei Stepanenko :

Soruyu pek anlamadım. Üzerinde herhangi bir manipülasyonu kolaylıkla gerçekleştirebileceğiniz bir dizi veriye sahipsiniz. Ve bir dosyadan dört satır kodla basit yazma ve okuma. Bu avantaj. Bir dosyada dizi yazımı düzenlenirken ne yansıtılmalı?

Dizide gerekli değişiklikleri yaptık, değiştirilen diziyi bir dosyaya yükledik, o kadar.

Buradaki zorluk, 20 uygulamanın aynı diziyle aynı anda çalışması gerekeceği gerçeğinde yatmaktadır ve belirli bir zamanda dizinin hangi düzenlenmiş sürümünün ilgili olduğunu belirlemek mümkün değildir.

Diyelim ki ilk danışman diziyi düzenledi ve yayınladı ve hemen üstüne başka bir danışmandan başka bir versiyon yazılıyor, ancak bir öncekinin revizyonunu hesaba katmadan ve bu kadar… kafa karışıklığı…

Örneğin, her danışman okuduktan sonra kendisiyle ilgili satırı silebilirse, her şey toplanır - kimse kimseye müdahale etmez ve dosya gereksiz verilerle aşırı yüklenmez ve düzenlenen dizi bir yarışta her yazıldığında, o zaman 20 danışmandan her birinden gelen verilerin alaka düzeyinin nasıl senkronize edileceği açık değildir.

 

Düşünmeniz gereken şey, birden fazla EA'nın aynı dosyaya erişimini yönetmektir.

İşte düşünmeniz gereken bir şey:

1. İki Uzman Danışmanın aynı anda aynı dosyayla çalışmasını önlemek için başka bir bayrak dosyası oluşturun. Bu dosya olmadığında, EA bir veri dosyası açma hakkına sahiptir, bundan önce bir bayrak dosyası oluşturarak diğerlerine o anda meşgul olduğunu gösterir. Okuma/yazma işleminden sonra EA , bayrak dosyasını siler . Artık veriler, diğer herhangi bir Uzman Danışmanın çalışması için ücretsizdir.

2. Bu dizideki verileri kullanan herhangi bir Uzman Danışman hakkında bilgi toplamak için değişkenler oluşturabilirsiniz. Bu değişkenleri aynı dosyaya yazın.

3. Normal bir dizi yerine, çeşitli veri türlerini içeren ve çok açıklayıcı bir dizi yapı oluşturun.

 struct MyData
   {
   int EANumber;
   datetime writeTime;
   double mydata1;
   double mydata2;
   } mydata[];
 
Aleksei Stepanenko :

Düşünmeniz gereken şey, birden fazla EA'nın aynı dosyaya erişimini yönetmektir.


birkaç Uzman Danışmanın bir veri kümesini yazması+ekle+seçmesi+okuması gerektiğinde, veritabanları ister istemez devreye girer.

bir şekilde " global değişkenler " ve bayrak dosyaları aracılığıyla onu mahvedebilirsin, ama kahretsin, neden?

bu, DBMS'nin yoludur. Çeşitli, ilişkisel, NoSQL ve diğerleri, ancak bunlar onlar. Ve orada, onların mekaniğinde, her şey yıllarca veya on yıllarca hata ayıklandı. Tüm kilitler-bayraklar-semaforlar-muteksler.
Bunu kopyalamaya çalışmak vahşi bir zaman kaybıdır.

 
Aynen öyle!