Удалить запись из файла c
Прочтите файл, удалите строку из памяти и верните содержимое в файл (перезапись). Если файл большой, вы можете прочитать его строку за строкой и создать временный файл, позже заменив исходный.
Для очень больших файлов я бы сделал что-то вроде этого
Обновление . Изначально я написал это еще в 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 для обоих, это произойдет автоматически)
- Если вы хотите заменить ввод на вывод, удалите файл ввода, а затем переместите файл вывода на место.
Чтобы удалить элемент из текстового файла, сначала переместите весь текст в список и удалите нужный элемент. Затем запишите текст, хранящийся в списке, в текстовый файл:
Я расширил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:
например я хочу удалить от туда запись 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.
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
Shurik <отступ> T
Bobik <отступ> F
Sharik <отступ> T
Ivanov <отступ> F
там где F то значит что они "мертвые".
а там где T то значит что они "живые".
а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями . и функция по удалению, которая по сути статусы меняет на F
С такой структурой можно будет "воскрешать мертвецов" ;)Если кого прибил по ошибке.
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
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 и отложенное исполнение
код выше почти точно такой же, как в первом примере, читая строку за строкой и сохраняя минимальный объем данных в памяти.
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 - никак не С++.
Читайте также: