2010-08-31 2 views
3

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

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

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

ответ

7

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

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

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

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

Branda теперь удаляется.

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

Редактировать

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

+0

+1: Если файл отсортирован, а записи фиксированного размера, то перемещение файла может быть еще более эффективным, как вы могли бы выполнить поиск в двоичном режиме. Но хороший трюк. –

5

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

1

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

2

Некоторые простые идеи, чтобы улучшить эффективность немного:

  • Вы не могли скопировать временный файл обратно в оригинал, но удалить оригинал после переименования новый как оригинал (если предположить, что они находятся в том же dir)
  • Используйте структуру данных в памяти для копирования файлов вместо временного файла поддержки (но при этом вы можете ограничить его размер и использовать его только как буфер)
  • Отметьте некоторые записи как удаленные, но не удаляйте их из файла, а затем после определенного количества операций удаления, которые вы можете предоставить, чтобы удалить физически t он записывает эти записи таким образом (но вы должны переписать свои другие операции в файле, чтобы игнорировать отмеченные записи)
2

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

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

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

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

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

0

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

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