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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
182172
Vladimir Karputov  

Какой должен быть правильный алгоритм, если мне нужно перезаписать первые пять строк 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
Dmitry Fedoseev
56778
Dmitry Fedoseev  
Karputov Vladimir:

...

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

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

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

Maxim Kuznetsov
12957
Maxim Kuznetsov  

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

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

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

Vladimir Karputov
Модератор
182172
Vladimir Karputov  
Dmitry Fedoseev:

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

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

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

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

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

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

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