Как удалить данные из файла c
Перейти к содержимому

Как удалить данные из файла c

  • автор:

Как удалить данные из файла c

Функция поиска по фамилии:

void SearchInDB() < FILE *f = fopen("db.txt", "rb"); FILE *num = fopen("num.txt", "rb"); if (f == NULL || num == NULL) < system("cls"); printf("\nНе удалось открыть файл базы данных"); printf("\nНажмите любую клавишу для выхода в меню"); getch(); >else < struct record recz[100]; int i, kol; fread((int*)&kol, 1, sizeof(kol), num); //заполнение массива записями из файла for (i = 0; i < kol; i++) < fseek(f, sizeof(recz[i])*i, 0); fread((char*)&recz[i], 1, sizeof(recz[i]), f); >int z, s = 0; char surn[12]; cin >> surn; system("cls"); printf("Поиск абонентов с фамилией %s", surn); for (z = 0; z < kol; z++) < if (strcmp(surn, recz[z].surn) == 0) < printf("\n\nЗапись №%i", recz[z].num); printf("\nФИО ->%s %s %s", recz[z].surn, recz[z].name, recz[z].patronymic); printf("\nНомер телефона -> %i", recz[z].tel); s++; > > if (s == 0) < printf("\n\nНе найдено абонентов с фамилией %s ", surn); >if (s == 1) < printf("\n\nБольше абонентов не найдено"); >> fclose(f); fclose(num); >

И аналогичные функции добавления абонента, создание базы данных и её просмотра (при необходимости выложу). Но никак не могу разобраться с функцией удаления абонента из базы данных (любым способом: по фамилии, по телефону или номеру, неважно).
Подскажите пожалуйста, как её реализовать?

Вот мой набросок:

void DelFromDB() < FILE *f = fopen("db.txt", "ab"); FILE *num = fopen("num.txt", "r+b"); if (f == NULL || num == NULL) < system("cls"); printf("\nНе удалось открыть файл базы данных"); printf("\nНажмите любую клавишу для выхода в меню"); getch(); >else < struct record recz[100]; int i, kol, c = 0, s = 0; fread((int*)&kol, 1, sizeof(kol), num); for (i = 0; i < kol; i++) < fseek(f, sizeof(recz[i])*i, 0); fread((char*)&recz[i], 1, sizeof(recz[i]), f); >printf("\nВведите № записи абонента, которого нужно удалить\n"); int number = getch(); for (int z = 0; z < kol; z++) < if (recz[z].num == number) < // и дальше тупик. >> fclose(f); fclose(num); > >

Заранее спасибо за любую помощь!

Последний раз редактировалось Alena_Sw; 02.12.2016 в 21:11 .

Удаление файлов

Функция remove() удаляет файлы. Она имеет следующий прототип:

int remove(const char *имя_файла);

В случае удачного выполнения она возвращает ноль, а в случае неудачного — не ноль.

Следующая программа использует remove() для удаления файла, определяемого пользователем:

/* пример использования remove() */
#include
int main(void)
char fname[80];
printf («Name of file to remove: «);
gets(fname);
if(remove(fname)) printf(«Error removing file»);
return 1;
>
else return 0;
>

Удаления из файла данных (C++)

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

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

15 ответов

29 октября 2007 года
256 / / 11.11.2005

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

29 октября 2007 года
140 / / 11.09.2007

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

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

29 октября 2007 года
256 / / 11.11.2005
#include
#include
#include

using namespace std;

int main()
ifstream in («test.dat», ios::in);
ofstream out(«test.new», ios::out);
char buff[256];
int num,i;

Алгоритм по совпадению строк отличается парой-тройкой строк
30 октября 2007 года
140 / / 11.09.2007

max_dark спасибо за код.

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

30 октября 2007 года
1.0K / / 08.01.2007
30 октября 2007 года
140 / / 11.09.2007

m_Valery Спасибо 🙂

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

int _tmain(int argc, _TCHAR* argv[])

почему в вместо main() стоит _tmain и что за фишки: (int argc, _TCHAR* argv[])
30 октября 2007 года
1.0K / / 08.01.2007

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

30 октября 2007 года
140 / / 11.09.2007

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

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

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

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

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

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

это я делаю примочки к этому заданию:
http://forum.codenet.ru/showthread.php?t=42495

30 октября 2007 года
256 / / 11.11.2005
С такой структурой можно будет «воскрешать мертвецов» 😉
Если кого прибил по ошибке.
31 октября 2007 года
100 / / 04.09.2007

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

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

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;

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

01 ноября 2007 года
49 / / 15.10.2006

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

06 декабря 2007 года
2 / / 06.12.2007

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

07 декабря 2007 года
1.0K / / 08.01.2007

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

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

с++ удалить данные из файла (стандартными средствами под виндовс)

Можно как то удалить из файла данные ? Мне нужно что то типа :

file.remove( позиция, количество байт);

Не хочу использовать способ с созданием копии и копированнием нужных данных туда, и удалением оригинала.
Способ прочитать в буфер содержимое файла с конца удаленных данных и потом записать их с позиции удаления и усечь файл мне известен.
Может есть что-то побыстрее ?

Плаформа только виндовс, может есть что от системных функций ?

#1
2:49, 13 авг 2020

vindast
> Плаформа только виндовс, может есть что от системных функций ?
Ты же понимаешь что предметно нет такой физической возможности — стереть удаляемую часть так, как будто она мелом написана и чтоб пространство само схлопнулось, ничего не двигая.

Вопрос стандартный:
— Зачем тебе это? Что за задача такая заставила тебя искать эту функцию?

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

  • Der FlugSimulator
  • Постоялец

#2
12:19, 13 авг 2020

vindast
> Плаформа только виндовс, может есть что от системных функций ?

Это вопрос не о виндовс/c++, а о низкоуровневом доступе к файловым системам.
Причём для одной (фс) решение будет работать, для другой — нет.

  • Vlad2001_MFS
  • Постоялец

#3
12:25, 13 авг 2020

vindast
А тебе их надо прямо удалять или просто файл урезать хватит?
Можно по идее, перейти в нужное место файла, а потом вызвать SetEndOfFile.
Переход в нужное место, по идее, SetFilePointer, хотя тут не уверен — винапи почти не пользовался.
В таком варианте никаких копирований и прочего не должно быть.

А, блин, только щас понял, что тебе скорее всего из середины удалять надо.

#4
14:38, 13 авг 2020

vindast
> Плаформа только виндовс, может есть что от системных функций ?
Копай в сторону mapping files.
А вообще задача тривиальная — открываешь файл, позиционируешь в начало смещаемых данных, поблочно читаешь-переписываешь их на N байт назад. В конце урезаешь длину файла

#5
15:21, 13 авг 2020

VoidSpirit
А если файл террабайтовый?

#6
16:15, 13 авг 2020

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

foxes
> — Зачем тебе это? Что за задача такая заставила тебя искать эту функцию?
Я сейчас пытаюсь придумать как мне организовать файловую структуру.

Vlad2001_MFS
> А тебе их надо прямо удалять или просто файл урезать хватит?
Мне нужно именно удалить кусок файла.

Vlad2001_MFS
> Можно по идее, перейти в нужное место файла, а потом вызвать SetEndOfFile.
> Переход в нужное место, по идее, SetFilePointer, хотя тут не уверен — винапи
> почти не пользовался.
> В таком варианте никаких копирований и прочего не должно быть.
Я +- такой вариант описал в шапке.

VoidSpirit
> Копай в сторону mapping files.
Что это должно дать?

VoidSpirit
> А вообще задача тривиальная — открываешь файл, позиционируешь в начало
> смещаемых данных, поблочно читаешь-переписываешь их на N байт назад. В конце
> урезаешь длину файла
+- такой вариант в шапке
samrrr
> А если файл террабайтовый?

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

#7
16:28, 13 авг 2020

vindast
> но это занимает ощутимое время даже на моих игрулях для конкурса
Купи 4 ssd и устрой raid 0. И не забывай что нужно в несколько потоков файлы заталкивать на диск. Если доберёшься до винапи, то там есть какбы «потоки» загрузки/выгрузки файла.

#8
16:29, 13 авг 2020

vindast
> Я сейчас пытаюсь придумать как мне организовать файловую структуру.
Допустим что ты будешь записывать в файл не последовательность байт, а свой собственный сегментируемый формат. Например каждый сегмент будет такого формата:

struct

Таким образом ты будешь изменять только два участка по 256 байт если между ними нужно удалить кусок. При этом? если удаляемый блок будет на границе или занимать несколько таких сегментов, достаточно изменить stаrt и end. В остальных случаях это будет перезапись всего 256 байт. Полезная информация в них будет на 2 байта меньше. Если несколько таких блоков подряд окажутся полностью пустыми, то можно будет согласовать это с секторами файловой системой и удалить по возможности полностью сектор не смещая и не перезаписывая основную часто данных.

#9
16:32, 13 авг 2020

foxes
> Допустим что ты будешь записывать в файл не последовательность байт, а свой собственный сегментируемый формат. Например каждый сегмент будет такого формата.
Какраз хотел предложить, у меня почти так октодерево в файл сохраняется. Но пока без дефрагментации.

#10
16:36, 13 авг 2020

samrrr
А если он захочет что то вставить? Тут придется делать двусвязный список из таких блоков и минус еще 8-16 байт. А при удалении/добавлении еще и переписывать все эти связи. Хотя можно и без списка, просто вкрячивать сектор(а) и добавлять туда пустые блоки, используемые по мере необходимости. Но работать с файлом на уровне файловой системы тот еще геморой.

#11
16:50, 13 авг 2020

samrrr
> Купи 4 ssd и устрой raid 0.
Отстань ) Это дороговато )

foxes
> А если он захочет что то вставить?
Что касается записи — то у меня все просто, просто пишу в конец.

#12
17:10, 13 авг 2020

vindast
Если нужен формат повышенной хитрожопости, можно попробовать https://www.sqlite.org/

А так, я думаю вот это
>грузить все память при открытии проекта, а при сохранении проекта переписать все его файлы
правильный подход.

#13
17:19, 13 авг 2020

CD
госпади помилуй опять с бд работать.

CD
> А так, я думаю вот это
> > рузить все память при открытии проекта, а при сохранении проекта переписать
> > все его файлы
> правильный подход.
Я тоже так думаю, на этом пока остановлюсь.

#14
18:22, 13 авг 2020

foxes
Да не, просто надо один раз такой драйвер запилить, а за основу взять 1-2-3-нодную систему записи от юникса.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *