Перезаписать часть строк txt файла

 

Какой должен быть правильный алгоритм, если мне нужно перезаписать первые пять строк txt файла? 

То есть "param_f=123" - это строка которую уже не нужно редактировать:

БылоДолжно стать
s=0s=0
df=12df=1256
asf=3asf=356
g=3g=3
n=0n=0
param_f=123 param_f=123 

Правильно ли я понимаю, что я должен открыть файл в режиме "FILE_READ|FILE_WRITE|FILE_TXT":

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- open file
   ResetLastError();
   string name="test.txt";
   int file_handle=FileOpen(name,FILE_READ|FILE_WRITE|FILE_TXT);
   if(file_handle!=INVALID_HANDLE)
     {
      FileWriteString(file_handle,"s=0"+"\r\n",-1);
      FileWriteString(file_handle,"df=1256"+"\r\n",-1);
      FileWriteString(file_handle,"asf=356"+"\r\n",-1);
      FileWriteString(file_handle,"g=3"+"\r\n",-1);
      FileWriteString(file_handle,"n=0"+"\r\n",-1);
      //--- close file
      FileClose(file_handle);
     }
   else
     {
      PrintFormat("Unable to open file %s, error = %d",name,GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

 

Что-то делаю не так, ибо текст был такой:

s=0
df=12
asf=3
g=3
n=0
param_f=123

а стал в полученном файле такой:

s=0
df=1256
asf=356
g=3
n=0
m_f=123

Другими словами из последней строки "param_f=123" (которую я даже не редактировал исчезли первые четыре буквы. Подозреваю, что смещение именно на четыре символа связано с тем, что я пытался дописать строки большей длины, чем они были до этого.

Файлы:
Test.mq5  3 kb
 
Karputov Vladimir:

...

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

Да. Файл, можно сказать, это непрерывный массив данных, ему без разницы, где читаемые символы, а где символы конца строк. Новая запись идет подряд, поверх старого.

Через вспомогательный файл надо. Открыть вспомогательный файл, записать эти новые строки, потом открыть другой файл, прочитат пять строк, а дальше читат строки и перписывать во вспомогательный файл. Потом старый файл удалить, новый переименовать. 

 

правильно это:

  1. - открыть файл на чтение
  2. - прочитать по строкам в массив строк
  3. - закрыть файл
  4. - поменять в массиве первые 5 элементов
  5. - открыть файл на запись
  6. - запись массив строк из массива
  7. - закрыть файл.

в реальной жизни добавляются блокировки, временные файлы и прочие грабли race-condition

 
Dmitry Fedoseev:

Да. Файл, можно сказать, это непрерывный массив данных, ему без разницы, где читаемые символы, а где символы конца строк. Новая запись идет подряд, поверх старого.

Через вспомогательный файл надо. Открыть вспомогательный файл, записать эти новые строки, потом открыть другой файл, прочитат пять строк, а дальше читат строки и перписывать во вспомогательный файл. Потом старый файл удалить, новый переименовать. 

Спасибо. Буду мудрить.
 
Maxim Kuznetsov:

правильно это:

  1. - открыть файл на чтение
  2. - прочитать по строкам в массив строк
  3. - закрыть файл
  4. - поменять в массиве первые 5 элементов
  5. - открыть файл на запись
  6. - запись массив строк из массива
  7. - закрыть файл.

в реальной жизни добавляются блокировки, временные файлы и прочие грабли race-condition

Это тоже неправильно. Это сработает только если в отредактированной версии количество символов должно быть не меньше, чем в исходной. А если их меньше, то в итоговом файле останется "хвост" от исходной версии. Дмитрий правильно написал - файл нужно удалять и вместо него создавать новый, в который и записывать отредактированное содержимое.
Причина обращения: