Как удалить строку из текстового файла в C #?
У меня проблема: как удалить строку из текстового файла на С#?
8 ответов
Прочитайте файл, удалите строку в памяти и верните содержимое в файл (перезапись). Если файл большой, вы можете прочитать его строку для строки и создать временный файл, позже заменив исходный файл.
Для очень больших файлов я бы сделал что-то вроде этого
Обновление Я изначально написал это еще в 2009 году, и я подумал, что это может быть интересно с обновлением. Сегодня вы можете выполнить вышеуказанное, используя LINQ и отложенное выполнение
Приведенный выше код почти точно такой же, как в первом примере, чтение строки за строкой и сохранение минимального объема данных в памяти.
Однако отказ от ответственности может быть в порядке. Поскольку мы говорим о текстовых файлах, вам очень редко придется использовать диск в качестве промежуточного носителя. Если вы не имеете дело с очень большими файлами журналов, не должно быть проблем с чтением содержимого в памяти и не иметь необходимости иметь дело с временным файлом.
Обратите внимание, что параметр .ToList имеет решающее значение для принудительного немедленного выполнения. Также обратите внимание, что все примеры предполагают, что текстовые файлы кодируются UTF-8.
Я согласен с Джоном Сондерсом, на самом деле это не С#. Однако, чтобы ответить на ваш вопрос: вам в основном нужно переписать файл. Есть два способа сделать это.
- Прочитайте весь файл в памяти (например, с помощью File.ReadAllLines )
- Удалите строку нарушения (в этом случае, вероятно, проще всего преобразовать массив строк в List<string> , а затем удалить строку)
- Запишите все остальные строки назад (например, с помощью File.WriteAllLines ) — потенциально преобразуйте List<string> в массив строк снова, используя ToArray
Это означает, что вы должны знать, что у вас достаточно памяти. Альтернатива:
How to delete a line from a text file in C#?
I have a problem: how can I delete a line from a text file in C#?
11 Answers 11
For very large files I’d do something like this
Update I originally wrote this back in 2009 and I thought it might be interesting with an update. Today you could accomplish the above using LINQ and deferred execution
The code above is almost exactly the same as the first example, reading line by line and while keeping a minimal amount of data in memory.
A disclaimer might be in order though. Since we’re talking about text files here you’d very rarely have to use the disk as an intermediate storage medium. If you’re not dealing with very large log files there should be no problem reading the contents into memory instead and avoid having to deal with the temporary file.
Note that The .ToList is crucial here to force immediate execution. Also note that all the examples assume the text files are UTF-8 encoded.
Удаления из файла данных (C++)
например я хочу удалить от туда запись Bobik или любую другую .
как можно сделать ? может сущетвует кой алгоритм удаления или надо мудрувать ?
15 ответов
впринцыпе все равно:p и вариант с удалением по сурагатному ключу или по совпаденю строк подходит
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
<
ifstream in («test.dat», ios::in);
ofstream out(«test.new», ios::out);
char buff[256];
int num,i;
max_dark спасибо за код.
я наверлно не правильно обяснил, по номеру строки не подходит.
лучше уж по совпадению строки:)))
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
<
ifstream tester(«test.dat»);
if(!tester)
<
cerr<<«Unable to open test.dat for reading»<<endl;
>
string name;
vector<string> coll;
while(getline(tester,name,’\n’)) <
coll.push_back(name);
>
for(int i = 0;i < coll.size();++i)
cout<<coll<< ‘\n’;
vector<string>::iterator pos;
cout<<«Input string»<<endl;
string str;
cin>>str;
pos = find(coll.begin(),coll.end(),str);
if(pos != coll.end())
coll.erase(pos);
cout<<endl;
for(int i = 0;i < coll.size();++i)
cout<<coll<< ‘\n’;
cout<<endl;
ofstream tester1(«test.dat»);
if(!tester1)
<
cerr<<«Unable to open test.dat for writing»<<endl;
>
for(int i = 0;i < coll.size();++i)
tester1 << coll << endl;
return 0;
>
m_Valery Спасибо 🙂
с кодом разобрался, только не смог асилить что значит это:
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
там где F то значит что они «мертвые».
а там где T то значит что они «живые».
а в самой проге будет функция которая проверяет статусы и работает только с «живыми» пользователями . и функция по удалению, которая по сути статусы меняет на F
как такая идея, что скажите ?
—
это я делаю примочки к этому заданию:
http://forum.codenet.ru/showthread.php?t=42495
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
там где F то значит что они «мертвые».
а там где T то значит что они «живые».
а в самой проге будет функция которая проверяет статусы и работает только с «живыми» пользователями . и функция по удалению, которая по сути статусы меняет на F
как такая идея, что скажите ?
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;
main()
<
ofstream out(«dogs.dat»,ios::app);
char *name = new char[15];
char status;
cout << «Enter dogs name and status:» << endl;
while(cin >> name >> status) // ввести EOF (Ctrl+Z) для выхода
<
out << name << » » << status << endl;
>
out.close();
while(in >> name >> status) // статус в переменной status
<
cout << setiosflags(ios::left) << setw(10) << name
<< setw(5) << status << endl;
>
in.close();
delete[] name;
>
в этом примере ты записываешь имя и статус, и читаешь имя и статус в отдельные переменные, и потом в цикле можешь сравнивать статус и вызывать функцию обработку с собаками
Построчно считываем файл в вектор.Вводим слово.которое хотим удалить,удаляем его и перезаписываем файл.Например так.
C#. Текстовые файлы. Решение задач на модификацию текстовых файлов. Классы File, StreamReader, StreamWriter
В данной теме приведены примеры решения наиболее распространенных задач, которые возникают при обработке текстовых файлов на языке C#. Примеры приведены для приложений, созданных по шаблону Console Application. Решение каждой задачи представлено соответствующей статической функцией. По желанию можно модифицировать продемонстрированные статические функции в функции экземпляра класса.
Для обработки текстовых файлов продемонстрирована работа классов File , StreamReader , StreamWriter .
Содержание
- 1. Как определить, что данные в текстовом файле закончились?
- 2. Последовательность действий при чтении данных из файла. Использование класса StreamReader
- 3. Функция PrintFile() . Вывести содержимое текстового файла на экран. Способ 1
- 4. Функция PrintFile2() . Вывести содержимое текстового файла на экран. Способ 2
- 5. Функция ReplaceStringInFile() . Замена строки в текстовом файле. Использование возможностей класса File
- 6. Функция RemoveStringFromFile() . Удаление строки из файла по индексу. Пример
- 7. Функция InsertLineInFile() . Вставка строки в файл в заданной позиции
- 8. Функция ConvertLinesFileToList() . Конвертировать строки файла в список List<string>
- 9. Функция AddArrayLinesInFile() . Добавление массива строк в конец файла
- 10. Функция SwapLinesInFile() . Обмен местами двух строк в файле
- 11. Функция ReverseStringsInFile() . Реверсирование строк файла (перестановка строк файла в обратном порядке)
- 12. Функция SortLineInFileBubble() . Сортировка строк в файле методом пузырька
Поиск на других ресурсах:
1. Как определить, что данные в текстовом файле закончились?
Чтение данных из текстового файла осуществляется с помощью метода ReadLine() . Метод читает строку символов из текущего потока и возвращает его в виде типа string . Признаком окончания строки есть символ ‘\n’ в файловом потоке. Если достигнут конец файла, метод ReadLine() возвращает значение null . Соответствующая проверка в программе позволяет определить, прочитано ли все данные из текстового файла.
2. Последовательность действий при чтении данных из файла. Использование класса StreamReader
Чтобы прочитать данные из текстового файла нужно выполнить приблизительно следующую последовательность действий:
1. Подключить модуль System.IO с помощью строки
2. Создать экземпляр класса StreamReader с помощью одного из перегруженных конструкторов. Одновременно с созданием экземпляра происходит открытие файла для чтения или записи. Класс StreamReader имеет несколько конструкторов.
В нижеследующем примере открывается текстовый файл с именем «TextFile1.txt» . Файл открывается для чтения (по умолчанию).
3. С помощью экземпляра StreamReader осуществить циклическое чтение строк файла как показано ниже
4. Закрыть файл с помощью метода Close()
3. Функция PrintFile() . Вывести содержимое текстового файла на экран. Способ 1
Для наглядной демонстрации чтения информации из текстового файла приводится статическая функция PrintFile() , которая выводит содержимое текстового файла на экран. Для чтения строк из файла функция использует метод ReadLine() класса StreamReader . Если достигнут конец файла, то ReadLine() возвращает null .
4. Функция PrintFile2() . Вывести содержимое текстового файла на экран. Способ 2
Ниже приведен пример статической функции PrintFile2() , которая использует метод ReadToEnd() класса StreamReader для чтения строк из файла. В отличие от ReadLine() , метод ReadToEnd() читает все строки из файла и записывает их в строку типа string включительно с символами ‘\n’ , ‘\r’ .
Алгоритм работы следующий:
- сначала читаются все строки из файла в одну строку типа string ;
- для полученной строки вызывется функция Split() , которая разбивает строку на массив строк. Признаком разбиения строки есть символ ‘\n’ ;
- вывести массив строк на экран.
5. Функция ReplaceStringInFile() . Замена строки в текстовом файле. Использование возможностей класса File
При операциях с файлами важно придерживаться правильной последовательности чтения/записи. Если попробовать изменять данные в файле непосредственно, то можно допустить много трудноуловимых ошибок. Поэтому, для замены строки в текстовом файле рекомендуется использовать следующий алгоритм:
- прочесть все строки из файла в массив. В примере для чтения строк из файла используется метод ReadAllLines() статического класса File . Этот метод возвращает массив типа string[] ;
- осуществить замену строки в массиве;
- записать строки из массива снова в файл. Для записи используется метод WriteAllLines() статического класса File . В метод передается имя файла и массив строк типа string[] , который нужно записать.
Текст демонстрационного консольного приложения следующий.
6. Функция RemoveStringFromFile() . Удаление строки из файла по индексу. Пример
При манипуляциях с файлами, которые изменяют общее количество строк в файле (вставка, удаление), лучшее представлять прочитанную информацию в виде списков типа List<string> . Это связано с тем, что в списки удобнее вставлять (удалять) элементы в конкретные позиции. Список не требует выделения дополнительных (часто больших) массивов информации в отличие от массива.
В данном примере продемонстрировано использование функции ReadLine() класса StreamReader . При чтении строки из файла эта функция удаляет символы ‘\r’ , ‘n’ , которые требуют дополнительной обработки.
7. Функция InsertLineInFile() . Вставка строки в файл в заданной позиции
По образцу пункта 6 можно реализовать вставку строки в файл в заданной позиции. Строки в файле предварительно копируются в список типа List<string> . Использование списков в подобных задачах облегчает работу программиста, поскольку списки содержат все необходимые методы вставки, добавления, удаления элемента.
Предложенная функция InsertLineInFile() имеет одну особенность. Если позиция вставки (нумеруется с 0) равна количеству элементов в файле n , то строка вставки добавляется в конец файла. Таким образом функция реализует вставку и добавление строки в файл.
8. Функция ConvertLinesFileToList() . Конвертировать строки файла в список List<string>
В пунктах 6, 7 повторяется код, который образовывает список типа List<string> из строк файла. Поэтому, целесообразно написать функцию ConvertLinesFileToList() , которая реализует конвертирование строк файла в список. Текст функции следующий.
9. Функция AddArrayLinesInFile() . Добавление массива строк в конец файла
В примере приведена функция, которая добавляет массив строк в конец файла. Данная функция использует функцию ConvertLinesFileToList() , которая возвращает строки файла в виде списка и описывается в пункте 8. Для работы с файлами используются возможности классов StreamReader и StreamWriter .
Алгоритм метода следующий:
- прочитать данные из файла в список типа List<string> ;
- добавить к списку массив строк;
- записать измененный список в файл. Для записи списка используются средства класса StreamWriter .
Программный код функции AddArrayLinesInFile() следующий.
Использование функции в другом программном коде может быть, например, таким.
10. Функция SwapLinesInFile() . Обмен местами двух строк в файле
Обмен местами двух строк в файле не изменяет общее количество строк. Поэтому, прочитанные строки из файла целесообразно представить массивом типа string[] .
В C# в статическом классе File есть полезная функция ReadAllLines() , которая возвращает строки файла в виде массива string[] . Как и в случае с функцией ReadLine() класса StreamReader , каждая строка в функции ReadAllLines() не содержит символов ‘\n’ и ‘\r’ .
Статический файл File также содержит функцию WriteAllLines() , которая записывает строки типа string[] в файл.
Ниже приведен фрагмент кода, который содержит описание функции SwapLinesInFile() .
Использование функции SwapLinesInFile() в другом коде может быть, например, таким