Удалить элемент из файла с

Обновлено: 05.07.2024

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

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

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

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

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

например я хочу удалить от туда запись Bobik или любую другую .

как можно сделать ? может сущетвует кой алгоритм удаления или надо мудрувать ?

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

впринцыпе все равно:p и вариант с удалением по сурагатному ключу или по совпаденю строк подходит

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 спасибо за код.

я наверлно не правильно обяснил, по номеру строки не подходит.
лучше уж по совпадению строки:)))

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 Спасибо :)

с кодом разобрался, только не смог асилить что значит это:


почему в вместо main() стоит _tmain и что за фишки: (int argc, _TCHAR* argv[]) Можешь вместо int _tmain(int argc, _TCHAR* argv[]) использовать
int main().int argc и _TCHAR* argv[]) - параметры командной строки. argc - количество параметров,argv - строки,представляющие отдельные значения. Смотри об этом подробнее в учебниках.В Visual Studio 2003,2005 используется int _tmain,в 6-й была просто main.

кстати а как вам такой вариант:

что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.

Tuzik <отступ> T
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F

там где F то значит что они "мертвые".
а там где T то значит что они "живые".

а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями . и функция по удалению, которая по сути статусы меняет на F

С такой структурой можно будет "воскрешать мертвецов" ;)
Если кого прибил по ошибке.

кстати а как вам такой вариант:

что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.

Tuzik <отступ> T
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F

там где F то значит что они "мертвые".
а там где T то значит что они "живые".

а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями . и функция по удалению, которая по сути статусы меняет на F

как такая идея, что скажите ?

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;
>

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

Можно функции read и write использовать, они записывают в файл структуры в текстовом виде, и соответственно могут удалять структуры Помогите написать похожую прогу плз.
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец. Помогите написать похожую прогу плз.
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.


Построчно считываем файл в вектор.Вводим слово.которое хотим удалить,удаляем его и перезаписываем файл.Например так.

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

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

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

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

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

Это первый файл по 0-му индексу. Свойства файла перечислены и все работает, но .

Как мы можем удалить элементы из DOM [object FileList] с помощью JavaScript?

Я нашел очень быстрый и короткий обходной путь для этого. Проверено во многих популярных браузерах (Chrome, Firefox, Safari);

Во-первых, вы должны преобразовать FileList в массив

Чтобы удалить конкретный элемент, используйте этот

Нет, мы можем сделать его съемным. Я реализовал это, и это работает определенно.

Сначала вам нужно инициализировать эти переменные

Затем напишите этот код при изменении ввода файла

Тогда наконец эти 2 функции помогут сделать все остальное

Наконец, когда вы отправляете свою форму, чем брать файлы из массива

Наконец-то нашел способ! До этого я знал, что input.files примет FileList, но единственный способ получить его - это событие перетаскивания.

Но теперь я знаю, как создать собственный список файлов!

Это работает в Chrome (и, возможно, некоторые другие)

Это работает в Firefox

Дело в том, что вам нужно перебрать каждый файл на входе, добавить те, которые вы все еще хотите сохранить, и назначить file.files с новым списком файлов.

Наиболее практичный способ удалить FileList object - просто удалить сам ввод файла из DOM и снова добавить его. Это удалит все элементы из списка файлов.

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

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

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

Ниже приведен пример с проверкой, которая удаляет все FileList object при сбое:

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