2015-03-06 6 views
-1

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

Name: Name1 
Surname: Surname1 
ID: 00000000 
Age: 30 


Name: Name2 
Surname: Surname2 
ID: 00000001 
Age: 32 

... 

Я считаю, чтобы сделать таким образом: я спрашиваю на входе в ID, я спрашиваю, что он хочет изменить (если это имя, фамилия, ID или возраст), а затем я спрашиваю, что он хочет изменить. Затем я ищу идентификатор в файле, и если он хочет изменить фамилию, я перемещаю FSEEK на -1, для имени я перемещаю FSEEK на -2 или я перемещаю FSEEK на +1, если он хочет изменить возраст.

Итак, есть ли более простой способ сделать это быстрее?

Спасибо :)

+0

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

ответ

1

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

я предпочел бы сделать следующее:

  • Открыть файл для чтения
  • Читать всю запись
  • Проверьте, если это тот, который должен быть изменен, и изменить его в случае
  • Запись записи во второй файл
  • Как только вы закончите запись, вы можете либо переименовать новый файл, перезаписывающий исходный, либо оставить вещи s есть.
+0

это хороший совет! Как я могу сделать, если пользователь хочет изменить запись с одинаковыми значениями? Например: name1 и имя 2 совпадают. Я проверяю уникальный идентификатор? Как я могу сделать? –

+0

Ваш первоначальный вопрос, казалось, предполагал, что идентификатор был уникальным (так же, как и примарный ключ в БД), если это так, вам нужно только проверить это поле при поиске обновленной записи. В противном случае, если может сравниться более одной записи, нет никакого «правильного» подхода. Вам придется принять решение о политике и придерживаться этого, то есть обновлять только первое или последнее совпадение, обновлять все совпадения или давать ошибку. – SukkoPera

2

Вы не можете вставить или удалить некоторую последовательность байтов внутри файла. Вы можете только перезаписать существующих байтов или добавить новые байты в конец файла (так как файлы <stdio.h> были стандартизированы и как ведут себя файлы POSIX или Windows, и как почти каждый file system -Я не знаю ни одного исключения сегодня - works)

Таким образом, вы можете создать новый файл из старого (тогда, возможно, rename новый, как старый).

Вы также можете прочитать весь файл в памяти и вывести весь новый контент из памяти.

Вы, вероятно, следует рассматривать абстракций более высокого уровня: индексированные файлы а-ля GDBM или простые базы данных а-ля Sqlite (или реальных базах данных, как PostgreSQL, MongoDb, и т.д ...)

Обратите внимание, что современные процессоры намного быстрее, чем диски (почти миллион раз для hard spinning disks - с временем доступа в десятки миллисекунд - и, вероятно, тысячи раз для SSD - с временем доступа около ста микросекунд). Поэтому имеет смысл (и намного больше, чем в предыдущем столетии) тратить некоторое время процессора на «организацию» данных, записанных в «файлы» или в «сеть».

Если вы работаете с ноутбуком или настольным компьютером, у него сегодня много оперативной памяти (несколько гигабайт), поэтому вполне вероятно, что все ваши данные будут в памяти. Также пропускная способность ОЗУ намного выше, чем диск, или SSD, или пропускная способность сети (и латентность RAM также намного ниже). Если вы управляете большим количеством данных (более гигабайта) с использованием системы базы данных, это разумно (в частности, потому что вы можете не писать все сразу).

Вы могли бы быть заинтересованы в serialization, application checkpointing, JSON ....