Функция записи в начало текстового файла

 
Как то на форуме спрашивали как произвести запись в начало файла. Уважаемый ROSH предложил функцию записи файла в массив строк http://simple-testing.blogspot.com/2007/03/blog-post_30.html, ну а потом сделать преобразования в массиве и опять записать данные из массива в файл.
Тут вот понадобилось как раз сделать запись в начало файла. Повозился с массивами и показалось это не удобно в моем варианте. Поэтому написал вот такую функцию, но уже чисто файловыми операциями. Думаю будет полезна.

Функция производит запись любой строковой переменной в начало указанного в параметрах имени файла.

//+------------------------------------------------------------------+
//| Функция записи строки в начало файла                             |
//| Параметры:                                                       |
//| row -строка для записи                                           |
//| FileName - имя файла для записи                                  |
//+------------------------------------------------------------------+
void WrStrToBeginFile(string row,string FileName) 
  {
    int hw,hw_t;
    int k,cnt;
    string rec;
    
    hw = FileOpen(FileName, FILE_CSV|FILE_READ|FILE_WRITE,'\t');           // открываем основной файл
    hw_t = FileOpen("Levels_temp.csv", FILE_CSV|FILE_READ|FILE_WRITE,'\t');//создаем временный файл
 
    FileWrite(hw_t,row);              //записываем первую строку во временный файл          
    while(!FileIsEnding(hw))          //считаем количество строк в основном файле   
      {
       FileReadString(hw);
       if(FileIsLineEnding(hw)) cnt++;
      }
      
    FileSeek(hw, 0, SEEK_SET);        //устанавливаем файловый указатель в начало основного файла
    for (k=0; k<cnt; k++)             //читаем из основного файла и дописываем все строки во временный
      {
       rec=StringTrimRight(FileReadString(hw));
       FileWrite(hw_t,rec); 
      }
             
    FileSeek(hw, 0, SEEK_SET);        //устанавливаем файловые указатели в начало обоих файлов
    FileSeek(hw_t, 0, SEEK_SET);  
           
    for (k=0; k<cnt; k++)             //переписываем все из временного файла в основной
      {
       rec=StringTrimRight(FileReadString(hw_t));
       FileWrite(hw,rec);  
       }
    FileClose(hw);                    //закрываем оба файла и удаляем временный
    FileClose(hw_t);                  
    FileDelete("Levels_temp.csv");      
 
 
//----
   return(0);
  }

Пример использования: (конечная часть кода скрипта)

В исходный файл( DJ_rw_file) предварительно скриптом записываются 4 строки с уровнями Р.Акселя принимаемыми со страницы инета. Каждая строка содержит данные по уровням сопротивления-поддержки по одной из валютных пар.
В примере каждая из указанных строк записывается в начало 4 отдельных файлов для работы индикатора.

/----сравниваем по пивотам EUR, если приняли новые уровни, пишем их в файлы для индикатора -----
 
       string rec, file_name;
       int hw_rw;
       if(pivot_eur!=pivot_eur_new)
        {
         hw_rw = FileOpen(DJ_rw_file, FILE_CSV|FILE_READ,'\t');//файл содержит четыре строки по 4 парам по форме DD.MM.YYYY;R3;R2;R1;Piv;S1;S2;S1         
         
         for(n=0; n<4; n++)                                    //по циклу записываем данные в первую строку каждого из четырех файлов с данными 
           {              
            rec=StringTrimRight(FileReadString(hw_rw));             
                             
            if(n==0) file_name="Levels_RS_eurusd.csv";
            if(n==1) file_name="Levels_RS_usdjpy.csv";
            if(n==2) file_name="Levels_RS_gbpusd.csv";
            if(n==3) file_name="Levels_RS_usdchf.csv";
               
            WrStrToBeginFile(rec,file_name);
           }
          FileClose(hw_rw);
          return(0);// записали данные - выходим  
         }

С уважением