запись-чтение из файла

 

Не могу разобраться, помогите.

В начале обработки тика читаю строки из файла, заполняю массив

   string sn1="",sn2="",sn3="",sn4="",sn5="";
   int handle = -1;

   for(int j=0; j<5; j++)
      {
        handle=FileOpen(filePares,FILE_CSV|FILE_READ,' ');
        Sleep(nz);
        if (handle>0) break;
      }
   if(handle>0)
   {
     ArrayResize(mPares,0);
     int i =0;
     bool StrIsEmpty=true; //устанавливаем флаг
     while(true)
     {
        sn1    = FileReadString(handle);//номер тикета -->
        if(StringLen(sn1)==0)
        { 
            FileClose(handle); 
            return(i); //если пустая строка в конце файла - ее игнорим
        } 
        sn2    = FileReadString(handle);
        sn3    = FileReadString(handle);
        sn4    = FileReadString(handle);
        sn5    = FileReadString(handle);
        i++;
        ArrayResize(mPares,i);
        mPares[i-1,0] = StrToInteger(sn1);
        mPares[i-1,1] = StrToInteger(sn2);
        mPares[i-1,2] = StrToInteger(sn3);
        mPares[i-1,3] = StrToInteger(sn4);
        mPares[i-1,4] = StrToInteger(sn5);
        StrIsEmpty=false;
        Print("прочли строку "+mPares[i-1,0]+" "+mPares[i-1,1]+" "+mPares[i-1,2]+" "+mPares[i-1,3]+" "+mPares[i-1,4]);
     }

Затем открываю этот файл на запись с обнулением

int handle=FileOpen(filePares,FILE_CSV|FILE_WRITE,' ');
FileClose(handle);

 внутри просматриваю массив, и как правило снова пишу массив в файл строками через функцию

int WriteLnToFileNoTest(string file, string Ln) //Пишет строку в файл
{
   for(int i=0; i<5; i++)
      {
         int handle=FileOpen(file,FILE_CSV|FILE_READ | FILE_WRITE,' ');
         if (handle>0) break;
         Sleep(nz);
      }
   if(handle>0)
   {
     int n=FileWrite(handle,Ln);
     if(n<0)  Print("не удалось записать в открытый файл "+file+" handle "+handle);
     else Print("записали строку "+Ln);
     FileClose(handle);
   }
   else Print("не удалось открыть файл "+file+" handle "+handle); 
}

 затем обрабатываю торговые сигналы, и этой же функцией могу дописать строку в файл.

 

Проблема заключается в том, что когда дописываю по новому сигналу в файл строку к уже существующей в нем... на следующем тике читаю только новую строку. Предыдущая исчезает.

В чем баг, подскажите, плиз. 

 

AKC:
AKC:

Не могу разобраться, помогите.

В начале обработки тика читаю строки из файла, заполняю массив

Затем открываю этот файл на запись с обнулением

 внутри просматриваю массив, и как правило снова пишу массив в файл строками через функцию

 затем обрабатываю торговые сигналы, и этой же функцией могу дописать строку в файл.

 

Проблема заключается в том, что когда дописываю по новому сигналу в файл строку к уже существующей в нем... на следующем тике читаю только новую строку. Предыдущая исчезает.

В чем баг, подскажите, плиз. 


 


Не могу разобраться, помогите.

В начале обработки тика читаю строки из файла, заполняю массив

Затем открываю этот файл на запись с обнулением

 внутри просматриваю массив, и как правило снова пишу массив в файл строками через функцию

 затем обрабатываю торговые сигналы, и этой же функцией могу дописать строку в файл.

 

Проблема заключается в том, что когда дописываю по новому сигналу в файл строку к уже существующей в нем... на следующем тике читаю только новую строку. Предыдущая исчезает.

В чем баг, подскажите, плиз. 

 

При дописывании в файл следует использовать функции позиционирования int FileTell(    int handle); bool FileSeek(    int handle, int offset, int origin)

https://docs.mql4.com/ru/files 

 
Sepulca:

При дописывании в файл следует использовать функции позиционирования int FileTell(    int handle); bool FileSeek(    int handle, int offset, int origin)

https://docs.mql4.com/ru/files 


Я пишу/читаю текстовый файл. Побайтово искать смещение затруднительно, т.к. строки разной длины.

А куда ставится указатель при открытии файла? Я ведь для каждой строки снова его открываю.

 
Sepulca:

При дописывании в файл следует использовать функции позиционирования int FileTell(    int handle); bool FileSeek(    int handle, int offset, int origin)

https://docs.mql4.com/ru/files 


Спасибо! Помогло.

     if (FileSeek(handle, FileSize(handle),SEEK_SET))
        int n=FileWrite(handle,Ln);

 Теперь пишет в конец файла.

А что же происходило, когда строка писалась в начало? Почему дальше первой строки не читалось? 

 
AKC:


Спасибо! Помогло.

 Теперь пишет в конец файла.

А что же происходило, когда строка писалась в начало? Почему дальше первой строки не читалось? 


Кажется понял - в текстовом варианте в конце строки добавляется признак конца файла. Поэтому, если писал строку в начало - то файл как-бы ею и заканчивался. Хотя были строки и дальше. 

 
      h=FileOpen("NS_w_"+Symbol()+Period()+"."+ext+"",FILE_WRITE|FILE_CSV,";");
                  for(int z6=0;z6<((vhodyClose+vhodyOpen+vhodyHigh+vhodyLow+vhodyVolume)*neiro);z6++)
                  {
                     double o=w[z6];
                     FileWrite(h,o);
                  }
                FileClose(h); //return;

Вот таким образом сохраняю значения массива w[z6] в файл txt

   int handle;
   handle = FileOpen(FileName1, FILE_CSV|FILE_READ,";");
   if(handle>0)
   {  
      //FileReadArray(handle, w, 0, ((vhodyClose+vhodyOpen+vhodyHigh+vhodyLow+vhodyVolume)*neiro));
      FileReadArray(handle, w);
      int size=ArraySize(w);
         //--- распечатаем данные из массива
         for(int ii2=0;ii2<size;ii2++)
           {
           Print("w = ",w[ii2]);
           }
         Print("Total data = ",size);
         //--- закрываем файл   
      FileClose(handle);
   }

Вот таким образом пытаюсь перевести данные из  текстового файла в массив w[], но другим советником. А получаю нули. Помогите переделать код, нужно получить правильные данные из файла.

 
Sergeu Petrov:

Вот таким образом сохраняю значения массива w[z6] в файл txt

Вот таким образом пытаюсь перевести данные из  текстового файла в массив w[], но другим советником. А получаю нули. Помогите переделать код, нужно получить правильные данные из файла.

Если всё это проверяется в тестере, то надо учитывать, что после остановки тестирования, все файлы удаляются. Чтобы не удалялись их надо писать в общую папку всех терминалов.

 
Нет, не в тестере, проверяю на графике онлайн. Каждый параметр записывается с новой строки
 

При таком открытии:

int handle=FileOpen(filePares,FILE_CSV|FILE_WRITE,' ');

файл полностью очищается.

Надо так:

int handle=FileOpen(filePares,FILE_CSV|FILE_WRITE|FILE_READ,' ');
Причина обращения: