удаление строки из текстового файла? - PullRequest
0 голосов
/ 07 марта 2011

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

В какой-то момент один из процессов завершится, и, следовательно, потребуетсяудален из файла (так как он больше не находится под контролем).

Вот пример содержимого файла (в который вводятся записи случайным образом):

PID=25729 IDLE=0.200000 BUSY=0.300000 USER=-10.000000
PID=26416 IDLE=0.100000 BUSY=0.800000 USER=-20.000000
PID=26522 IDLE=0.400000 BUSY=0.700000 USER=-30.000000

Так, например,если я хочу удалить строку с надписью PID = 26416 .... как я могу это сделать, не перезаписывая файл заново?

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

Спасибо!

Ответы [ 7 ]

1 голос
/ 07 марта 2011

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

Очевидным способом сделать это с "внешними командами UNIX" будет grep -v "PID=26416" (или любой PID, который вы хотите удалить, очевидно).

Edit: вероятно, стоит упомянуть, что , если строки имеют одинаковую длину (как показано здесь) и порядок не имеет значения, вы можете удалить строку более эффективно, скопировав последняя строка в свободном месте, затем укоротите файл, чтобы исключить последнюю строку. Это будет только , если они действительно имеют одинаковую длину (например, если вы получили PID '1', вам нужно добавить его к той же длине, что и остальные в файле) .

1 голос
/ 07 марта 2011

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

0 голосов
/ 07 марта 2011

Почему вы поддерживаете их в текстовом файле?Это не лучшая модель для такой задачи.Но если вы застряли с этим ... если эти строки гарантированно будут иметь одинаковую длину (это видно из примера), и если порядок строк в файле не имеет значения, то выможет написать последнюю строку над строкой для процесса, который умер, а затем сократить файл на одну строку с помощью вызова (f) truncate (), если вы работаете в системе POSIX: см. ответ Джонатана Леффлера в Какусекать файл в C?

Но обратите внимание на ответ netrom, который дает три различных способа сохранить эту информацию.

Также, если вы придерживаетесь текстового файла (желательно написанногос нуля каждый раз из структур данных, которые вы поддерживаете, согласно первому предложению netrom), и вы хотите быть уверены, что файл всегда правильно сформирован, а затем записать новые данные во временный файл на том же устройстве (поместив его в тот жеЭто самый простой каталог), а затем выполните вызов rename (), который является атомарной операцией.

0 голосов
/ 07 марта 2011

Вы можете использовать sed:

sed -i.bak -e '/PID=26416/d' test

-i для редактирования на месте. Он также создает файл резервной копии с новым расширением .bak

-e для указания шаблона. / D указывает, что все строки, соответствующие шаблону, должны быть удалены.

test - это имя файла

0 голосов
/ 07 марта 2011

Unix-команда для него:

grep -v "PID=26416" myfile > myfile.tmp

mv myfile.tmp myfile

Часть grep -v выводит файл без строк с поисковым термином.

Часть > myfile.tmp создает новый временный файл для этого вывода.

Часть mv переименовывает временный файл в исходный файл.

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

0 голосов
/ 07 марта 2011

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

Вы не можете.Файловые системы (возможно, помимо более эзотерических основанных на записях) не поддерживают вставку или удаление.

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

0 голосов
/ 07 марта 2011

Единственный способ - скопировать каждый символ, который идет после удаленной строки, поверх символов, которые удаляются.

Гораздо эффективнее просто переписать файл.

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