Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2016, 21:09   #1
Alena_Sw
Новичок
Джуниор
 
Регистрация: 25.11.2016
Сообщений: 1
По умолчанию Удаление элемента из файла

Всем доброго времени суток!
Есть структура
Код:
struct record
{
	int num;
	char surn[12];
	char name[12];
	char patronymic[12];
	int tel;
};
Функция поиска по фамилии:
Код:
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.
Alena_Sw вне форума Ответить с цитированием
Старый 03.12.2016, 17:59   #2
olej.tsil
Заблокирован
 
Регистрация: 29.11.2016
Сообщений: 215
По умолчанию

Цитата:
Сообщение от Alena_Sw Посмотреть сообщение
И аналогичные функции добавления абонента, создание базы данных и её просмотра (при необходимости выложу).
Вот уж не надо!

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

А при удалении записи с порядковым номером N вам нужно было бы переписать последовательно все записи с N+1 и до последней - на позицию предыдущей записи.
Но это чудовищно накладно!

Вы можете просто добавить в структуру bool поле "действительная запись", при удалении сбрасывать этот признак в false, а при обработке просто пропускать недействительные записи в файле.
olej.tsil вне форума Ответить с цитированием
Старый 03.12.2016, 18:59   #3
Hailov
Пользователь
 
Регистрация: 08.10.2016
Сообщений: 18
По умолчанию

Правильно. А если не хочется иметь лишние записи, то можно удалять их при выходе из программы, перезаписывая файл.
Hailov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента списка Aerowalk Помощь студентам 1 08.10.2014 20:09
c++ удаление элемента списка NinjaNoob Помощь студентам 1 28.01.2013 04:01
Процедура удаление элемента Liagushka Паскаль, Turbo Pascal, PascalABC.NET 4 11.03.2012 10:09
Удаление элемента списка igoldyrev Помощь студентам 2 06.03.2011 14:24
Удаление элемента из списка bpystep Помощь студентам 4 09.07.2010 14:55