Удалить запись из файла

Обновлено: 07.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.
Программа которая приведена в этой теме работает только если в файле один столбец.


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

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

  • Весь контент сайта(все содержимое хостинга)
  • Полные права на доменное имя сайта(сделаем трансфер)
  • Копирайт сайта на большом количестве сторонних ресурсов так как сайту уже более 4-х лет
  • Готовый движок форума и все исходные тексты системы управления сайтом
  • Все исходные тексты ПО которое опубликовано на сайте
  • Все почтовые ящики доменного имени
  • Все домены третьего уровня

Дополнительную информацию о статистике посещения, клиентах, вы можете узнать написав на почту koder@koder.kz

Добавил admin | Категория Pascal за 12 уроков, перевод | 06 Февраля 2014

В этом уроке мы с вами рассмотрим:

  • Чтение из файла
  • Создание и запись в файл
  • Добавление данных в существующий файл
  • Удаление файлов
  • Использование директив ,
  • Создание и удаление вложенных каталогов
  • Описание функции FileSize()

Введение
Файл содержит данные которые в свою очередь хранятся на жестком диске подключенному к компьютеру. Операционная система предоставляет инструменты для работы с файлами(файловой системой). Текстовые файлы как правило могут содержать текст и графическую информацию, комбинированную. Для работы с текстовыми файлами используются текстовые процессоры которые имеются в операционной системе. Текстовые файлы сохраняются на жестком диске компьютера с расшитением *.TXT или *.DOC, *.DOCX. файлы с расширением *.TXT создаются с помощью стандартного текстового процессора Notepad. Но будем помнить что некоторые программы позволяют нам сохранять так сказать отформатированный текст, или текст с картинками, для таких целей NOTEPAD естественно не подходит. Для такого текста используются специальные пакеты программ, такие например как Microsoft Word, Open Office и другие. Такие программы используют несколько иной подход для создания файла нежели NOTEPAD. Таким образом файл созданный в Microsoft Word невозможно правильно открыть в NOTEPAD, а вот файл *.TXT легко открывается в текстовом редакторе Word. Программы которые могут читать файлы расширения *.Ххх называют программами просмоторщиками файлов.
Чтение из файла
Прочитать информацию из файла на языке Паскаль не составит большого труда. Обратите внимание что в Паскале нет никаких зарезервированных слов которые используются для чтения или записи информации в файл. Для этих целей используются уже знакомые нам readln() and writeln(). И так пример, как читать информацию из файла

И так что мы с вами написали. У нас появилась новая переменная типа Text. Такая переменная применяется когда вы хотите получить доступ из своей программы к определенному текстовому файлу. Переменная FileName используется для ввода пользователем имени файла(readln(FileName);). Связь переменной UserFile с файлом, путь к которому указан в переменной FileName осуществляется с помощью функции Assign полный текст будет такой Assign(UserFile, FileName + '.txt'); после этого происходит чтение из файла в цикле Repeat который завершается только после того как достигнут конец файла Eof(UserFile). Чтение из файла производиться функцией Readln(UserFile,TFile); где указывается файл из которого нужно считать строку и переменная в которую мы считаем эту строку. Процеду Writeln(TFile); выводит эту строку к нам на экран.
Создание файла, добавление данных
Давайте сразу посмотрим пример создания и добавления информации в файл.

В приведенном выше примере мы создаем файл с названием 'Textfile' на диске C:\. Создаться файл функцией Rewrite(UserFile); после чего в файл записываются строки Writeln(UserFile,'PASCAL PROGRAMMING');… Writeln(введите свою строку в ваш файл:'); тут первым параметром является файл в который записывается информация и вторым информация которую нужно добавить в файл. После чего мы считываем пользовательскую строку Readln(Txt);, добавляем пустую строку в наш файл Writeln(UserFile,'');потом говорим что сейчас будет пользовательская статья Writeln(UserFile,'The user entered this text:');, записываем пользовательскую статью Writeln(UserFile,Txt); И закрываем файл Close(UserFile);. Помните, файл всегда нужно закрывать, после окончания работы и открывать перед началом работы.
Добавление данных в существующий файл
Для того что бы добавить данные в существующий файл, его нужно открыть на чтение, добавить нужную информацию и закрыть, но не перезаписывать. Некоторые начинающие программисты на самом деле плохо понимают как не перезаписать файл с данными которые они хотели ввести, это общая проблема:

Выполните программу несколько раз, откройте файл 'C:\ADDTEXT.TXT' и посмотрите что в нем. Вы видите только одно предложение? ReWrite(UFile); функция которая открывает файл на перезапись.
Понимаете да что нам не подходит открытие файла с помощью ReWrite(UFile);, нужна какая то новая функция, и она есть это append(f) где F это переменная типа текст, ну мы с вами проходили уже это в этом же уроке. Теперь наша программа будет выглядеть так:

Выполните программу несколько раз для того что бы увидеть изменения.
Удаление файлов
В Паскале для того что бы удалить файл используется зарезервированное слово Erase(f) где F может быть путем к файлу('C:\ADDTEXT.TXT') или самим файлом, переменной типа текст. Важным замечанием будет то что файл удаляется совсем, то есть в корзине своего компьютера вы его не найдете.
В отличии от других функций для работы с файлами функция Erase(f) не открывает файл для его удаления, так что вам не нужно закрывать файл после его удаления.
Пример программы:

Если наш файл не найден функция IOResult вернет значение 0 а если файл не найдет значит функция вернет отличное от нуля значение.
ВАЖНО: если файл успешно найден, файл откроется и вы должны поработав с ним закрыть его, как показано в примерах выше. А вот если он не найден то здравый смысл подсказывает что он не может быть открыт, соответственно и закрывать и работать нам не с чем. Внимательно посмотрите пример еще раз, если у вас есть какие то вопросы, пожалуйста задавайте их в комментариях. Запустите программу несколько раз, с существующими и не существующими файлами, посмотрите на результат работы.
Директивы компилятора рекомендуется использовать со всеми функциями для открытия файлов 'rewrite()', 'append()', 'erase()', а так же 'FSearch()'. Обязательно попрактикуйте этот урок, повторюсь, в случае вопросов обязательно оставляйте их в коментариях. Создание и удаление вложенных каталогов
В языке Pascal есть функции для работы с каталогами. С помощью их можно создавать или удалять каталоги с жестких дисков компьютера. Что бы создать директорию в Паскале используется функция 'createdir(c)' где С имеет тип PChar. PChar является переменной указателем, которая содержит адрес динамической переменной заданного типа. Каталог создается следующим образом:
NewDir := FSearch('C:\Pascal Programming',GetEnv('')); if NewDir = '' then CreateDir('C:\Pascal Programming');
давайте теперь пример, сразу в примере разберем функцию FSearch:

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

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

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

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

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

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