Заменить строку в файле - PullRequest
       13

Заменить строку в файле

0 голосов
/ 15 сентября 2010

У меня очень большой текстовый файл, и моей программе для iPad иногда приходится заменять одну строку данных (новая строка: '\ n').Как я могу сделать это эффективно?Записать весь файл за один раз - не вариант.

Я искал NSFileHandle, и похоже, что он будет делать то, что я хочу;Прямо сейчас у меня возникают проблемы с выяснением, как найти строку X, а затем заменить ее данными из строки.Я думаю, что после того, как это сделано, все, что мне нужно сделать, это вызвать synchronizeFile, верно?

Я ценю вашу помощь!

1 Ответ

1 голос
/ 15 сентября 2010

Вы не можете сделать это без записи всего файла. Вы можете искать в начале строки, а затем написать новую строку. Но сначала вы должны выяснить смещение этой линии. Если у вас его еще нет, это означает чтение файла с начала до этой строки. Тогда вы можете написать новую строку, но только если она точно такой же длины, что и исходная строка. Если он длиннее, он перезапишет следующую строку - нет способа вставить данные в файл. Если новая строка короче старой, конец старой строки останется. То же самое требование длины также сложно. Это означает одинаковую длину в байтах. В зависимости от кодировки символов для некоторых символов может потребоваться больше байтов, чем для других.

Если вам действительно нужно это сделать и заставить его работать практически в каждом случае, вам нужно будет выполнить следующие шаги:

  1. Прочитайте весь файл, чтобы узнать смещение интересующей вас линии
  2. Искать смещение линии
  3. Написать новую строку
  4. Запишите остаток файла, который вы прочитали на шаге 1.

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

Вы на самом деле убедились, что выписывать весь файл недопустимо, или вы здесь преждевременно оптимизируете? Если ваш текстовый файл действительно такой большой, вам следует подумать о базе данных, такой как SQLite, или использовать Core Data.

...