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

Обновлено: 06.07.2024

Примеры работы с текстовыми файлами. Модификация файлов. Сортировка данных в файлах. Конвертирование данных файла в массив

В данной теме наводятся примеры решения известных задач, возникающих при обработке текстовых файлов на языке C++. Проработав решения этих задач, вы научитесь обрабатывать массивы строчных данных, управлять распределением памяти а также использовать средства C++ для работы с текстовыми файлами.

Содержание

  • 2. Функция CountLinesInFile() . Подсчет количества строк в текстовом файле
  • 3. Функция GetStringsFromFileC() . Получить массив (список) строк типа char* из текстового файла
  • 4. Функция GetStringsFromFileS() . Получить массив строк типа string из текстового файла
  • 5. Функция SetStringsToFileS() . Записать массив (список) строк типа string в текстовый файл
  • 6. Функция ChangeStringInFileC() . Замена строки в текстовом файле
  • 7. Функция RemoveStringFromFileByIndex() . Удаление строки из файла по его номеру
  • 8. Функция InsertStringToFile() . Вставка строки в заданную позицию в файле
  • 9. Функция SwapStringsInFile() . Обмен местами двух строк в файле
  • 10. Функция ReverseStringsInFile() . Реверсирования строк файла (перестановка строк файла в обратном порядке)
  • 11. Функция SortStringsInFile() . Сортировка строк в файле
  • Связанные темы

Поиск на других ресурсах:

1. Как определить, что данные в текстовом файле закончились?

Для определения конца файла используется функция eof() . Функция возвращает результат типа bool . Прототип функции следующий

здесь std – пространство имен, в котором объявлена функция eof() .

Если при вызове функции текущий указатель чтения указывает на конец файла, то функция возвращает true . В противном случае функция возвращает false .

Пример 1.

Ниже приведен фрагмент кода, в котором используется функция eof() для определения, достигнут ли конец файла, которому соответствует экземпляр с именем inputFile

Пример 2.

Чаще всего функция eof() используется в цикле while при чтении строк файла

Как только будет достигнут конец файла inputFile , то произойдет выход из цикла.

2. Функция CountLinesInFile() . Подсчет количества строк в текстовом файле

Функция CountLinesInFile() возвращает количество строк в текстовом файле.

Использование функции GetStringsFromFileC() может быть, например, следующим:

4. Функция GetStringsFromFileS() . Получить массив строк типа string из текстового файла

Работа с типом string более удобна чем с типом char *. В следующем фрагменте кода реализована функция GetStringsFromFileS() , читающая строки из текстового файла и записывающая их в массив (список) типа string . Данная функция использует функцию CountLinesInFile() , которая описывается в пункте 2 данной темы.

Использование функции GetStringsFromFileS() может быть, например, следующим

Результат работы программы (содержимое файла TextFile1.txt ):

5. Функция SetStringsToFileS() . Записать массив (список) строк типа string в текстовый файл

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

Ниже приведен пример использования функции SetStringsToFileS() .

6. Функция ChangeStringInFileC() . Замена строки в текстовом файле

В примере приведена функция, заменяющая строку в файле в заданной позиции. Данная функция использует следующие функции:

Данная функция не использует дополнительный файл для копирования. Функция получает строки файла в виде списка lines, которые служат копией файла. Затем происходит запись этих строк в этот же файл за исключением строки, которую нужно заменить в файле. В позиции замены записывается входная строка замены. Таким образом происходит замена строки в текстовом файле.

Использование данной функции може быть, например, следующим:

По желанию, можно изменить ввод входных данных (имя файла, позиция, строка замены).

7. Функция RemoveStringFromFileByIndex() . Удаление строки из файла по его номеру

Удаление строки из файла по его номеру можно выполнять по примеру п. 6 (замена строки в текстовом файле).
Общий алгоритм следующий:

  • прочитать все строки файла в массив (список);
  • удалить строку из массива;
  • записать модифицированный массив обратно в файл.

Для формирования списка строк можно использовать функции GetStringsFromFileC() и GetStringsFromFileS() , которые описаны в пунктах 3 и 4.

Текст функции удаления строки по его номеру следующий.

Использование функции может быть, например, следующим

8. Функция InsertStringToFile() . Вставка строки в заданную позицию в файле

Подход такой же, как в предыдущих пунктах. Нужно получить строки файла в виде массива (тип string или char *). Затем нужно вставить строку в массив и записать измененный массив строк обратно в файл.
Если значение позиции вставки равно количеству элементов в файле, то строка добавляется в конец файла.

Вызов функции InsertStringToFile() в функции main() может быть следующим.

9. Функция SwapStringsInFile() . Обмен местами двух строк в файле

Сокращенный алгоритм функции SwapStringsInFile() следующий:

  1. Прочитать строки файла в список.
  2. Поменять строки в списке.
  3. Записать измененный список обратно в файл.

Текст функции обмена строк следующий.

Вызов функции SwapStringsInFile() из функции main() может быть следующим

10. Функция ReverseStringsInFile() . Реверсирования строк файла (перестановка строк файла в обратном порядке)

Алгоритм метода следующий:

  • считать строки из файла и записать их в массив;
  • обменять местами элементы массива так, чтобы строки массива размещались в обратном порядке;
  • записать измененный массив снова в файл

Текст функции ReverseStringsInFile() следующий

Использование ReverseStringsInFile () может быть, например, следующим

11. Функция SortStringsInFile() . Сортировка строк в файле

В примере демонстрируется сортировка строк файла с помощью метода вставки. Предварительно строки копируются в массив и там сортируются. Затем, отсортированный массив строк обратно записывается в файл.

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

на очень большие файлы, я бы сделал что-то вроде этого

обновление я изначально написал это еще в 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 заявления для обоих, это произойдет автоматически)
  • если вы хотите заменить вход на выход, удалите входной файл, а затем переместите выходной файл на место.

я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:

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

Необходимо удалить все элементы, у которых год выпуска меньше заданного.

Вот код: создаёт файл и мы записываем туда структуру, но мне надо потом ввести год и программа должна удалить все строки, у которых год выпуска меньше заданного. Как это сделать?


183k 13 13 золотых знаков 103 103 серебряных знака 208 208 бронзовых знаков 1) Открываем файл с записями (ф1) на чтение. 2) Открываем новый файл (ф2) на запись. 3) читаем по очереди записи из ф1, если запись удовлетворяет условию (например год больше заданного), записываем запись в ф2. 4) закрываем файлы и заменяем ф1 на ф2. Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа). Отформатируйте как следует и хватит плодить одинаковые вопросы, вы там за всю группу задания постите что ли? Вам уже объясняли основной алгоритм: 1) Открываем файл на чтение. 2) читаем по очереди строки из файла, если строка удовлетворяет условию, записываем её в во временную строковую переменную. 3) закрываем файл 4) открываем тот же файл на перезапись, записывам полученную в пункте 2 строку. Ах да, самое главное забыл, вы хоть добавьте в описание вопроса разяснение проблемы, что именно в коде не работает? Ну или хотя бы опишите словами то, что код должен делать и вам быстро напишут какой-нибудь вариант решения (просто ваши вопросы очень размытые мягко говоря). И, все-таки, отформатируйте код в вопросе.

Как-то так, только проверьте, давно ничего не читал из файлов.

7,266 10 10 серебряных знаков 29 29 бронзовых знаков Точку с запятой расставили (я там пропустил в паре мест)? На какие скобки? Этот код должен быть внутри main, ну и Ваш outfile закрыть нужно сначала.

Ну, первая ошибка - комментарий начинается с // , а не \\ :)

А вторая и главная - вы объявили record.year как string , но сравниваете это поле с int . Что больше - "литр" или 15? - примерно так у вас получилось.

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


183k 13 13 золотых знаков 103 103 серебряных знака 208 208 бронзовых знаков @Софья Ну я же указал вторую. третья - думаю, стоимость тоже не стоит делать строкой. Далее, если вы попробуете ввести как марку машины, например, Volkswagen Passat - как два слова - то второе слово окажется ценой. Думаю, пока хватит.

Начнем с мелочи - вы пишете в файл, открытый для чтения. Но это мелочь. Посмотрите сами, что делает ваша программа во второй части: считывает и выводит кучу записей из файла (надеюсь, что он есть и не пуст. ), затем пытается проверить последнюю (не помню уж, формально - не имеет ли права fread испортить память при ошибке чтения), и если она проходит условие - пытаетесь дописать ее в конец файла, открытого для чтения. "Где же логика?!" (с) Анекдот про Вовочку.

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

И еще - это вот, несмотря на применение cin - никак не С++.


183k 13 13 золотых знаков 103 103 серебряных знака 208 208 бронзовых знаков

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

Для очень больших файлов я бы сделал что-то вроде этого

Обновление . Изначально я написал это еще в 2009 году и подумал, что будет интересно с обновлением. Сегодня вы можете сделать это, используя LINQ и отложенное выполнение.

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

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

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

  • Прочитать весь файл в память (например, с помощью File.ReadAllLines )
  • Удалите неправильную строку (в этом случае, вероятно, проще всего преобразовать массив строк в List<string> , а затем удалить строку)
  • Запишите все остальные строки обратно (например, с помощью File.WriteAllLines ) - потенциально преобразуйте List<string> в массив строк снова, используя ToArray

Это означает, что вы должны знать, что у вас достаточно памяти. Альтернатива:

  • Откройте как входной файл, так и новый выходной файл (как TextReader / TextWriter , например, с File.OpenText и File.CreateText )
  • Прочтите строку ( TextReader.ReadLine ) - если вы не хотите ее удалять, запишите ее в выходной файл ( TextWriter.WriteLine )
  • Когда вы прочтете все строки, закройте и читатель, и писатель (если вы используете операторы using для обоих, это произойдет автоматически)
  • Если вы хотите заменить ввод на вывод, удалите файл ввода, а затем переместите файл вывода на место.

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

Я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:

Читайте также: