Удалить строку из файла с
Примеры работы с текстовыми файлами. Модификация файлов. Сортировка данных в файлах. Конвертирование данных файла в массив
В данной теме наводятся примеры решения известных задач, возникающих при обработке текстовых файлов на языке 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() следующий:
- Прочитать строки файла в список.
- Поменять строки в списке.
- Записать измененный список обратно в файл.
Текст функции обмена строк следующий.
Вызов функции 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 заявления для обоих, это произойдет автоматически)
- если вы хотите заменить вход на выход, удалите входной файл, а затем переместите выходной файл на место.
я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:
чтобы удалить элемент из текстового файла, сначала переместите весь текст в список и удалите нужный элемент. Затем запишите текст, хранящийся в списке, в текстовый файл
Необходимо удалить все элементы, у которых год выпуска меньше заданного.
Вот код: создаёт файл и мы записываем туда структуру, но мне надо потом ввести год и программа должна удалить все строки, у которых год выпуска меньше заданного. Как это сделать?
Как-то так, только проверьте, давно ничего не читал из файлов.
7,266 10 10 серебряных знаков 29 29 бронзовых знаков Точку с запятой расставили (я там пропустил в паре мест)? На какие скобки? Этот код должен быть внутри main, ну и Ваш outfile закрыть нужно сначала.Ну, первая ошибка - комментарий начинается с // , а не \\ :)
А вторая и главная - вы объявили record.year как string , но сравниваете это поле с int . Что больше - "литр" или 15? - примерно так у вас получилось.
Это ответ на ваш конкретный вопрос, но это еще не все ошибки. Намекну, например, что при объявлении массива его размер должен быть известен при компиляции.
Начнем с мелочи - вы пишете в файл, открытый для чтения. Но это мелочь. Посмотрите сами, что делает ваша программа во второй части: считывает и выводит кучу записей из файла (надеюсь, что он есть и не пуст. ), затем пытается проверить последнюю (не помню уж, формально - не имеет ли права fread испортить память при ошибке чтения), и если она проходит условие - пытаетесь дописать ее в конец файла, открытого для чтения. "Где же логика?!" (с) Анекдот про Вовочку.
И еще - если вы так пишете код, не форматируя - вы мешаете сами себе. Поймите, всякие отступы и т.п. - это не придирки преподавателя. Согласитесь, что такой код, как показан ниже, гораздо проще понимать. А современные редакторы по сути сами его делают таким (вопрос скорее - как вам удается так его корежить?)
И еще - это вот, несмотря на применение cin - никак не С++.
Прочтите файл, удалите строку из памяти и верните содержимое в файл (перезапись). Если файл большой, вы можете прочитать его строку за строкой и создать временный файл, позже заменив исходный.
Для очень больших файлов я бы сделал что-то вроде этого
Обновление . Изначально я написал это еще в 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 для обоих, это произойдет автоматически)
- Если вы хотите заменить ввод на вывод, удалите файл ввода, а затем переместите файл вывода на место.
Чтобы удалить элемент из текстового файла, сначала переместите весь текст в список и удалите нужный элемент. Затем запишите текст, хранящийся в списке, в текстовый файл:
Я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:
Читайте также: