Удалить запись из файла? - PullRequest
3 голосов
/ 31 августа 2010

Я использую текстовый файл для хранения своих данных. данные хранятся в следующем формате.

Antony|9876543210
Azar|9753186420
Branda|1234567890
David|1357924680
John|6767676767

Тысячи записей хранятся в этом файле. Я хочу удалить конкретную запись, скажем «Дэвид | 1357924680». Я использую C, как эффективно удалить конкретную запись? В настоящее время я использую временный файл для копирования записей в этот временный файл, пропуская запись, которую я хочу удалить. и после копирования во временный файл я копирую содержимое временного файла в исходный файл, обрезая все содержимое исходного файла. я не думаю, что я делаю это эффективно. Помоги мне.

Ответы [ 6 ]

7 голосов
/ 31 августа 2010

Добавьте столбец к вашим данным, указав, что это допустимая (1) или удаленная (0) строка:

Antony|9876543210|1
Azar|9753186420|1
Branda|1234567890|1
David|1357924680|1
John|6767676767|1

Если вы хотите удалить запись, перезапишите один байт:

Antony|9876543210|1
Azar|9753186420|1
Branda|1234567890|0
David|1357924680|1
John|6767676767|1

Branda теперь удалена.

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

Edit

Столбец достоверности, вероятно, должен быть первым столбцом, поэтомуВы можете пропустить удаленные строки более просто.

5 голосов
/ 31 августа 2010

Я думаю, что ваш подход немного неправильный.Если вы действительно хотите сделать это эффективно, используйте базу данных, например, sqlite.Это простая в использовании база данных в простом файле.Но он предлагает много мощности sql и очень эффективен.Таким образом, добавление новых записей и удаление не будут проблемой (также поиск будет легким).Так что проверь: http://www.sqlite.org/.Вот учебник за 3 минуты, который на примере объяснит, как сделать все, что вы пытаетесь сделать здесь: http://www.sqlite.org/quickstart.html.

2 голосов
/ 31 августа 2010

Я бы сказал аналогичное решение, которое дал "Роберт С. Барнс".

Я бы изменил David|1357924680 до |--------------- (равное количество байтов).

  • Нет необходимости в дополнительных байтах (небольшая польза)

  • Данные действительно удалены.Это полезно, когда это необходимо для понятий безопасности.

Некоторое время спустя (ежедневно, еженедельно, ...) делайте то же самое / аналогично тому, что вы делаете сейчас.

2 голосов
/ 31 августа 2010

Несколько простых идей для повышения эффективности:

  • Вы не можете скопировать временный файл обратно в оригинал, но удалить оригинал после переименования нового в оригинал (предположим, что они находятся в одном каталоге)
  • Используйте структуру данных в памяти для копирования файлов вместо временного файла поддержки (но, сделав это, вы можете ограничить его размер и использовать его только в качестве буфера)
  • Пометьте некоторые записи как удаленные, но не удаляйте их из файла, затем после определенного количества операций удаления вы можете обеспечить физическое удаление записей, помеченных таким образом (но вы должны переписать другие ваши операции над файлом, чтобы игнорировать отмеченные записи)
1 голос
/ 31 августа 2010

Три предложения:
1. Сделайте так, как вы описываете, но вместо копирования временного файла обратно в оригинал, просто удалите оригинал и переименуйте временный файл.Это должно выполняться в два раза быстрее.
2. Перезаписать запись с помощью «XXXXXXX» или чего-либо еще.Это очень быстро, но может не подойти для вашего проекта.
3. Используйте сбалансированное двоичное дерево.Это «профессиональное» решение.Если возможно, избегайте программирования с нуля!

0 голосов
/ 31 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...