Удалить все строки из файла
прочитайте файл, удалите строку в памяти и поместите содержимое обратно в файл (перезапись). Если файл большой, вы можете прочитать его строку за строкой и создать временный файл, позже заменив исходный.
на очень большие файлы, я бы сделал что-то вроде этого
обновление я изначально написал это еще в 2009 году и я думал, что это может быть интересно с обновлением. Сегодня вы можете выполнить вышеуказанное, используя LINQ и отложенное исполнение
код выше почти точно такой же, как в первом примере, читая строку за строкой и сохраняя минимальный объем данных в памяти.
A отказ от ответственности может быть в порядке. Поскольку мы говорим о текстовых файлах, вам очень редко придется использовать диск в качестве промежуточного носителя. Если вы не имеете дело с очень большими файлами журналов, не должно быть никаких проблем с чтением содержимого в память и избежать необходимости иметь дело с временным файлом.
отметим, что .ToList имеет решающее значение здесь, чтобы заставить немедленное исполнение. Также обратите внимание, что все примеры предполагают, что текстовые файлы кодируются UTF-8.
- читать весь файл в память (например, File.ReadAllLines )
- удалите оскорбительную строку (в этом случае, вероятно, проще всего преобразовать массив строк в List<string> затем удалить строку)
- напишите все остальные строки назад (например, с File.WriteAllLines ) - потенциально преобразовать List<string> в массив строк снова с помощью ToArray
это означает, что вы должны знать, что у вас есть достаточно памяти, хотя. Альтернатива:
- Откройте как входной файл, так и новый выходной файл (как TextReader / TextWriter , например, File.OpenText и File.CreateText )
- читать строки ( TextReader.ReadLine ) - если вы не хотите удалять его, напишите в выходной файл ( TextWriter.WriteLine )
- когда вы прочитаете все строки, закройте как считыватель, так и писатель (Если вы используете using заявления для обоих, это произойдет автоматически)
- если вы хотите заменить вход на выход, удалите входной файл, а затем переместите выходной файл на место.
я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:
чтобы удалить элемент из текстового файла, сначала переместите весь текст в список и удалите нужный элемент. Затем запишите текст, хранящийся в списке, в текстовый файл
Сейчас я делаю это, используя что-то вроде этого, чтобы удалить все строки в файле:
Как я могу удалить все строки, используя vi ?
Примечание: использование dd не является хорошим вариантом. Там может быть много строк.
@MadTux, только если вы начинаете с первой строки. 1GdG будет работать из любого места. echo | test.txt не является допустимой командой, если test.txt это не исполняемый скрипт. Я предполагаю, что вы имеете в виду echo >test.txt вместо этого? Обратите внимание, что не используя vi , >test.txt достаточно обрезать его до нулевой длины - не echo нужно.удалить все строки.
: Вводит команду (и перемещает курсор вниз).
Это 1,$ указание того, над какими строками d должна работать следующая команда ( ). В этом случае диапазон от первой строки до последней строки (обозначен $ , так что вам не нужно знать количество строк в документе).
Финал d обозначает удаление указанных строк.
Существует более короткая форма ( :%d ), но я никогда не использую ее. Это :1,$d может быть легче "приспособлено", например, :4,$-2d оставить только первые 3 и последние 2 строки, удалив остальные.
Про совет. Не более ESC+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd+dd.В vi я использую
- : говорит vi перейти в командный режим
- % означает все строки
- d : удалять
В командной строке
будет делать также.
В чем проблема с дд?
- /dev/null специальный 0-байтовый файл
- if это входной файл
- of это выходной файл
Я бы порекомендовал вам просто сделать это (должно работать в любой POSIX-совместимой оболочке):
Если вы действительно хотите сделать это с помощью vi, вы можете сделать:
- 1G (перейти к первой строке)
- dG (удалить до последней строки)
Если ваш курсор находится на первой строке (если нет, введите: gg или 1G ), то вы можете просто использовать dG . Это удалит все строки от текущей строки до конца файла. Поэтому, чтобы убедиться, что вы удалите все строки из файла, вы можете смешать обе вместе, что будет: ggdG (в командном режиме).
Или %d в режиме Ex, пример командной строки: vim +%d foo.bar .
+1 за эргономичность: 1, $ d. Не то чтобы наши пальцы не были настроены на то, чтобы все время печатать двоеточие; во всяком случае;) Я считаю, что это ( ggdG ) самый простой метод в Vim. Причина, по которой этот ответ не одобряется как другие, заключается в том, что gg в чистом vi его нет?Я ленивый чувак, и мне нравится быть простым. ggdG пять нажатий клавиш в том числе Shift
gg идет к первой строке в файле, d является началом d глагола elete и G является движением, чтобы перейти к нижней части файла. Более подробно, это перейти в начало файла и удалить все до конца плитки.
РВКР. Я тоже ленивый и использую :$d или :1,$d это более быстрый способ (я пишу меньше символов) kkk :%d Хорошая альтернатива, так как вы также используете только 5 нажатий клавиш.Перейти к началу файла и нажмите d G .
Я всегда использую ggVG
- gg переходит к началу текущего файла редактирования
- V (с заглавной буквы v) выберет текущую строку. В этом случае первая строка текущего файла редактирования
- G (с заглавной буквы g) перейдет к концу файла. В этом случае, поскольку я выбрал первую строку, G выделю весь текст в этом файле.
Затем вы можете просто нажать d или, x чтобы удалить все строки.
Если вы используете d вертикально, он автоматически применяется аналогично. dl удаляет символ справа, dj удаляет, например, строку вниз.обратите внимание, что в вашем вопросе echo > test.txt создается файл с одним разрывом строки, а не пустой файл.
Из оболочки рассмотрите возможность использования echo -n > test.txt или : > test.txt .
Хотя я обычно использую команду редактирования vi (я использую ggdG ), вы также можете вызвать оболочку со ссылкой на текущий файл, например, так:
Это почти так же кратко, как ggdG , но сложнее набрать, и вы также должны подтвердить, что вы хотите перезагрузить измененный файл, поэтому я не особенно рекомендую его в этом случае, но знать, как использовать команды оболочки из vi, как это полезно.
Я хочу, чтобы вывод выглядел так: каждая вторая строка будет удалена, но между строками не будет пропуска.
Вы хотите удалить каждую вторую строку или все строки, которые содержат «Ошибка не возникла» ? Что, если в двух последовательных строках было написано «Нет ошибки» ? @ user1598390 Я думаю . в этом случае grep -v "No error occurred" file эта команда должна работать . на что ответил @paul. В выходном файле не будет строк, содержащих «Нет ошибок».Если у вас есть старше awk (как oawk ), вам нужно:
отредактируем файл на месте.
- g пометить глобальную команду
- /$/ соответствовать каждой линии
- +d удалить следующую строку
- wq! сохранить все изменения
Этот подход разделяет тот же идеал с sed подходом, удаляя каждую следующую строку текущей строки, начиная со строки 1.
Да . он работает . :) . первый работает . я тоже пробовал второй . он говорит `awk: синтаксическая ошибка line1 awk: вылетает около строки 1 'Да, работает @cuonglm .
Я предполагаю, что вы использовали n\;d вместо того, 'n;d' чтобы сохранить драгоценный символ, но эта логика выходит за рамки, когда вы без необходимости используете -e переключатель и перенаправление файлов < ! @ Geek: Это просто более короткая версия sed -e 'n;d' , за исключением одного персонажа. @Geek: n команда записать пространство шаблона в стандартный вывод, если он -n был использован, а затем заменить пространство шаблона следующей строкой. Здесь каждая нечетная строка будет напечатана n , четная строка затем будет считана в пространство шаблона, но немедленно d удалена командой`.Решение этой проблемы путем удаления каждой второй строки может привести к ошибкам (например, когда процесс иногда генерирует две значащие строки вместо одной). Может быть, лучше отфильтровать мусор
Он может работать как фильтр, вы можете добавить больше шаблонов мусора и улучшить результат.
+1 за указание на то, что иногда важна вторая строка!В связи с вопросом, с GNU sed :
удалит каждую вторую строку, но я бы хотел предложить строки фильтра по содержанию:
Необходимо удалить все элементы, у которых год выпуска меньше заданного.
Вот код: создаёт файл и мы записываем туда структуру, но мне надо потом ввести год и программа должна удалить все строки, у которых год выпуска меньше заданного. Как это сделать?
Как-то так, только проверьте, давно ничего не читал из файлов.
7,266 10 10 серебряных знаков 29 29 бронзовых знаков Точку с запятой расставили (я там пропустил в паре мест)? На какие скобки? Этот код должен быть внутри main, ну и Ваш outfile закрыть нужно сначала.Ну, первая ошибка - комментарий начинается с // , а не \\ :)
А вторая и главная - вы объявили record.year как string , но сравниваете это поле с int . Что больше - "литр" или 15? - примерно так у вас получилось.
Это ответ на ваш конкретный вопрос, но это еще не все ошибки. Намекну, например, что при объявлении массива его размер должен быть известен при компиляции.
Начнем с мелочи - вы пишете в файл, открытый для чтения. Но это мелочь. Посмотрите сами, что делает ваша программа во второй части: считывает и выводит кучу записей из файла (надеюсь, что он есть и не пуст. ), затем пытается проверить последнюю (не помню уж, формально - не имеет ли права fread испортить память при ошибке чтения), и если она проходит условие - пытаетесь дописать ее в конец файла, открытого для чтения. "Где же логика?!" (с) Анекдот про Вовочку.
И еще - если вы так пишете код, не форматируя - вы мешаете сами себе. Поймите, всякие отступы и т.п. - это не придирки преподавателя. Согласитесь, что такой код, как показан ниже, гораздо проще понимать. А современные редакторы по сути сами его делают таким (вопрос скорее - как вам удается так его корежить?)
И еще - это вот, несмотря на применение cin - никак не С++.
Читайте также: