Как удалить строку из файла с
Перейти к содержимому

Как удалить строку из файла с

  • автор:

Удаление строки из файла

Я очень часто встречаю вопрос типа «Как удалить определенную строку из файла?». Народ совсем не хочет шевелиться, ведь так легко зайти на любой крупный форум по PHP, и в сроке поиска написать что-то типа «Удаление строк из файла». Пятерка результатов гарантирована. Итак, в первой части статьи мы как раз рассмотрим способ удаления определенной строки из текстового файла.

Для начала было бы совсем не плохо создать текстовый файл. Назовём его file.txt, который будет состоять из строк, которые мы будем удалять:

строка один строка два строка три строка четыре строка пять

Затем создаём что-нибудь типа file.php, занимающий около 11 строк!

Сначала определимся, что для удаления определенной строки нам нужен её номер. Его мы будем передавать с идентификатором id: file.php?id=2 (удалим строку под номером ТРИ, так как исчисления элементов в массиве ведётся с нуля, но позже мы это сгладим).

  • функция file() считывает весь файл в массив (каждая строка — это его элемент);
  • $id-вычитает один из нашего идентификатора, так что 2 становится 2, а 3 — 3;
  • unset($file[$i]) удаляет или обнуляет элемент массива (но только из памяти, т. е. виртуально:);
  • implode() объединяет массив в одну строку. Это очень важно, так как если бы это опустили, наш файл бы похудел до бесполезной записи Array;

Удаление строки из файла С++

Можно, но сложнее в реализации — можно допустить ошибку. Копируете остаток файла после удаляемой строки в буфер в памяти. Потом записываете его с адреса начала удаляемой строки. В конце вычисляете новый размер файла и «обрезаете» его с помощью std::filesystem::resize_file .
Если памяти мало (остаток не помещается в память), то ограничиваете размер буфера (например 1 Mb) и повторяете в цикле так пока не перепишете весь остаток файла.

Отслеживать
ответ дан 31 мая 2022 в 10:56
4,568 1 1 золотой знак 6 6 серебряных знаков 19 19 бронзовых знаков

Посмотрите на man fseek (а также ftell там же) и вперед.

Например, вот так

#include #include #include #include // first argument -- `file-name`, second -- line number for delete (counts from zero) int main (int ac, char *av[]) < if (ac != 3) < fprintf(stderr, "Usage: %s file-name line-number\n", av[0]); exit(1); >size_t lineno = atoi(av[2]); FILE *file = fopen(av[1], "r+"); if (!file) < perror(av[1]); exit(1); >struct stat st; fstat(fileno(file), &st); char *line; ssize_t ll; size_t n = 0, lsz = 0; long pos = -1; while ((ll = getline(&line, &lsz, file)) > 0) < if (n == lineno) < pos = ftell(file); break; >n++; > if (pos == -1) < fprintf(stderr, "line %zd not found (%zd lines in the file)\n", lineno, n); exit(2); >free(line); long wpos = pos - ll; // printf("line %zd found at pos %zd (end at pos %zd)\n", // lineno, wpos, pos); size_t bsize = 1024 * 128; char *buf = (char *)malloc(bsize); size_t lr; while ((lr = fread(buf, 1, bsize, file))) < pos = ftell(file); fseek(file, wpos, SEEK_SET); fwrite(buf, 1, lr, file); wpos = ftell(file); fseek(file, pos, SEEK_SET); >ftruncate(fileno(file), st.st_size - ll); return puts("End") == EOF; > 

Ага, g++ компайлер признает этот код вполне крестовым (т.е. с++-шным)

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

Самым же оптимальным, видимо, должен быть вариант с использованием mmap (в результате этого вызова часть адресного пространства пользователя будет отображаться на адреса в файловом кэше ядра, содержащие файл).

Затем несколькими memchr() в цикле фиксируется нужная строка и вызывается memmove() для сдвига данных файла прямо в памяти ядра. В конце (как и в приведенном коде) вызов truncate() обрезает файл до нужного размера.

Удаление строк из файла с использованием sed

Последнее обновление 21.08.2019, 16:09 от пользователя В Unix команда SED удаляет одну или несколько строк из указанного файла по желанию пользователя. Эта утилита используется для работы с командной строкой Unix, для удаления из файла выражений, которые могут быть идентифицированы с помощью определяющего разделителя (например, запятая, табуляция или пробел), по номеру строки или путем поиска строки, выражения или адреса строки в синтаксисе sed.

Sed: удалить одну или несколько строк из файла

Вот как можно удалить одну или несколько строк из файла.

Синтаксис

sed ‘<[/]||[/]>d’
sed ‘<[/][,][/]d’

/. /=разделители n = номер строки string = ряд символов, найденный в строке regex = регулярное выражение, соответствующее искомому шаблону addr = адрес строки (номер или шаблон) d = удалить (delete)

Примеры Sed

Вот несколько примеров использования приведенного выше синтаксиса. Используйте следующий код, чтобы удалить третью строку:

sed '3d' fileName.txt

Удалите строку, содержащую ряд букв «awk», используя:

sed '/awk/d' filename.txt

Вы можете удалить последнюю строку, введя:

sed '$d' filename.txt

Или удалить все пустые строки:

sed '/^$/d' filename.txt 
sed '/./!d' filename.txt

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

sed '/[0-9/][0-9]*$/d' filename.txt

Удалить интервал между строками 7 и 9:

sed '7,9d' filename.txt

Та же операция, что и приведенная выше, но с заменой адреса параметрами:

sed '/-Start/,/-End/d' filename.txt

Вышеприведенные примеры отображают изменения только при открытии файла (stdout1 = screen). Для постоянных изменений в старых версиях (ниже 4) используйте временный файл для GNU sed с использованием команды -i [suffix]:

sed -i".bak" '3d' filename.txt

Изображение: © John Schnobrich — Unsplash.com

Контент нашего сайта создается в сотрудничестве с экспертами в области IT и под руководством основателя CCM.net Жана-Франсуа Пиллу. CCM — ведущий международный сайт о технологиях, доступный на 11 языках.

Как удалить строки из текстового файла?

Например, игрок 1 находился на 5-м месте, а какой-то следующий игрок 2 побил этот рекорд и стал на 5-м месте, а игрок 1 на 6-м месте, вам нужно удалить игрока, который находится на 6-м месте из файла!

в этом коде есть словарь — ключ — имя игрока, значение — время в секундах (чем меньше — тем лучше)

Все результаты (ключ и значение) записываются в файл в другой форме, и в этой форме они копируются в словарь и прокручиваются из словаря по метке как конечный результат, но я не могу удалить проигрыватели из файла, который оставил рейтинг.

Как сделать удаление этого игрока в файле?

private static Dictionary AllNames() < return File .ReadLines(@"C:\Users\HP\Desktop\картинки\results.txt") .Where(line =>!string.IsNullOrWhiteSpace(line)) .Select(item => item.Split(' ')) .ToDictionary(items => items[0], items => int.Parse(items[1])); > private void updateRatingLabels() < var tops = AllNames() .OrderBy(pair =>pair.Value) .ThenBy(pair => pair.Key, StringComparer.Ordinal) .Take(5) .ToArray(); for (int i = 18; i ", true).First().Text = ""; for (int i = 28; i ", true).First().Text = ""; for (int i = 0; i < tops.Length; ++i) < Controls.Find($"label", true).First().Text = tops[i].Key; Controls.Find($"label", true).First().Text = $":"; > >
  • Вопрос задан более трёх лет назад
  • 2518 просмотров

1 комментарий

Простой 1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *