Nie można usunąć danej osoby z bazy danych – dlaczego? Co dodac w case 1 ?

0

Witam mam mały problem napisałem baze danych ale gdy chce usunąć daną osobe z bazy to nie mogę (w tym kodzie daje wolne miejsce) i juz nie wiem jak to moge zrobic

#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct osoba
{
	char nazwisko[20];
	char imie[20];
	char plec[10];
	int wiek;
	int wzrost;
//	struct osoba *prev;
//	struct osoba *next;
};
//struct osoba *pierwsza = NULL; //wskaźnik na pierwszy element
//struct osoba *ostatnia = NULL; //wskaźnik na ostatni element
int czyotwarto = 0; // do sprawdzenia warunku
char nazwa[25]; // do indywidualnej nazwy pliku
FILE *plik;
char *str;
void TworzenieBazy()
{
	system("cls");
	char nazwa[25];
	printf(">> Tworzenie nowej bazy danych <<\nPodaj nazwe pliku wraz z rozszerzeniem: ");
	scanf("%s", nazwa);

	system("cls");
	plik = fopen(nazwa, "a+"); // utworzenie pliku podanego w argumencie nazwa
	if (plik != NULL)
	{
		printf("Zadanie wykonane.\nUwaga: Jesli plik o podanej nazwie juz istnial, jego zawartosc nie zostanie usunieta!\n");
	}
	fclose(plik);
}
void OtwieranieBazy()
{
	system("cls");
	printf(">> Otwieranie istniejacej bazy danych <<\nPodaj nazwe pliku z baza danych wraz z rozszerzeniem: ");
	scanf("%s", nazwa);

	plik = fopen(nazwa, "r+"); // otwarcie pliku podanego w argumencie nazwa
	system("cls");
	if (plik == NULL)
	{
		printf("Nie udalo sie otworzyc pliku\n");
		czyotwarto = 0;
	}
	else
	{
		printf("Plik otwarto pomyslnie!\n");
		czyotwarto = 1;
	}
}
void WyswietlanieBazy()
{
	system("cls");
	printf(">> Zawartosc bazy danych <<\n>> Nawisko Imie Plec Wiek Wzrost <<\n\n");
	rewind(plik); // przewinięcie pliku do początku, na wszelki wypadek
	int znak;
	while // zczytywanie pliku znak po znaku aż do jego końca
		((znak = fgetc(plik)) != EOF)
		putchar(znak);
}
void WyszukiwanieiUsuwanie()
{
	system("cls");
	printf(">> Wyszukiwanie osob w bazie danych <<\n");
	rewind(plik);
	int wiersz = 1; // numer wiersza, rozpoczęcie od pierwszego
	int wynik = 0; // czy istnieje wynik wyszukiwania
	char temp[512];
	char szukany[20]; 
	printf("Szukana fraza: "); scanf("%s", &szukany); // użytkownik podaje nazwisko do znalezienia
	while (fgets(temp, 512, plik) != NULL) 
	{
		if ((strstr(temp, szukany)) != NULL) // porównywanie 
		{
			printf("Osoba znaleziona na pozycji: %d\n", wiersz);
			printf("\n%s\n", temp);
			wynik++;
		}
		wiersz++;
	}
	if (wynik == 0) 
	{
		printf("\nNie znaleziono takiej osoby\n");
	}
	if (wynik != 0)
	{
		int wybor3;
		printf("Czy chcesz usunac jakis wiersz?\n1 - Tak, 2 - Nie   ");
		scanf("%i", &wybor3);
		switch (wybor3)
		{
		case 1://Tak
	  
			break;
		case 2://Nie
			break;
		default: // użytkownik podał złą wartość
		{
			system("cls");
			printf("Operacja nierozpoznana.\n");
		}
		}
		system("cls");
	}
}
void Dodawanie()
{
	system("cls");
	printf(">> Dodawanie osoby do bazy danych <<\n");
	osoba *nowy;
	nowy = (osoba*) malloc(sizeof(osoba));

	printf("Nazwisko: "); scanf("%s", nowy->nazwisko);
	printf("Imie: "); scanf("%s", nowy->imie);
	printf("Plec: "); scanf("%s", nowy->plec);
	printf("Wiek: "); scanf("%i", &nowy->wiek);
	printf("Wzrost: "); scanf("%i", &nowy->wzrost);

	fprintf(plik, "%s %s %s %i %i\n", nowy->nazwisko, nowy->imie, nowy->plec, nowy->wiek, nowy->wzrost);
	free(nowy);
}
void Czyszczenie()
{
	system("cls");
	printf(">> Czyszczenie zawartosci bazy danych <<\nPodaj nazwe pliku z baza danych wraz z rozszerzeniem: ");
	scanf("%s", nazwa);
	plik = fopen(nazwa, "w");
	fclose(plik);
}
//void Usuwanie()
//{
//	system("cls");
//	printf(">> Usuwanie osoby z bazy danych << \n");
//	FILE *kopia;
//	char ch;
//	int usun_wiersz, temp = 0;
//
//	ch = getc(plik);
//	while (ch != EOF)
//	{
//		printf("%c", ch);
//		ch = getc(plik);
//	}
//	rewind(plik);
//	printf(" \n Enter line number of the line to be deleted:");
//	scanf("%d", &usun_wiersz);
//	//open new file in write mode
//	kopia = fopen("zapasowa.txt", "w");
//	ch = getc(plik);
//	while (ch != EOF)
//	{
//		ch = getc(plik);
//		if (ch == '\n')
//			temp++;
//		//except the line to be deleted
//		if (temp != usun_wiersz)
//		{
//			//copy all lines in file replica.c
//			putc(ch, kopia);
//		}
//	}
//	fclose(plik);
//	fclose(kopia);
//	remove(nazwa);
//	rename("zapasowa.txt", nazwa); //zmiana nazwy pliku kopia.txt na oryginalną nazwę bazy
//	printf("\n Baza danych po aktualizacji: \n");
//	plik = fopen(nazwa, "r");
//	rewind(plik); // przewinięcie pliku do początku, na wszelki wypadek
//	int znak;
//	while // zczytywanie pliku znak po znaku aż do jego końca
//		((znak = fgetc(plik)) != EOF)
//		putchar(znak);
//}

int _tmain(int argc, _TCHAR* argv[])
{
	int wybor1 = 0;
	int wybor2 = 0;

	do
	{
		printf("\n>> Baza Danych <<\n");
		printf("\n>> Menu glowne <<\n1 - Utworzenie nowej bazy danych\n2 - Skorzystanie z istniejacej bazy danych\n3 - Czyszczenie bazy danych\n666 - Wyjscie z programu\n>> Wybieram opcje: ");
		scanf("%i", &wybor1);
		printf("\n");

		switch (wybor1)
		{
		case 1: 
			TworzenieBazy(); // Tworzenie nowej bazy danych
			break;
		case 2:
		{
			OtwieranieBazy(); // Otwieranie gotowego pliku z bazą danych

			if (czyotwarto == 1) // Kolejne czynności mogą się wykonać wyłącznie jeśli baza danych została otwarta
			{
				do
				{
					printf("\n>> Menu <<\n1 - Wyswietlenie calej bazy\n2 - Dodawanie osob do bazy\n3 - Wyszukiwanie i usuwanie osob z bazy\n555 - Wyjscie do glownego menu\n666 - Wyjscie z programu\n>> Wybieram opcje: ");
					scanf("%i", &wybor2);
					printf("\n");

					switch (wybor2)
					{
					case 1: // Wyświetlenie całej bazy
						WyswietlanieBazy();
						break;
					case 2: // Dodawanie osób do bazy
						Dodawanie();
						break;
					case 3: // Wyszukiwanie i usuwanie
						WyszukiwanieiUsuwanie();
						break;
					case 666: // wyjście z programu
					{
						printf("Goodbye\n");
						for (int zegar = 1; zegar <= 699999999; zegar++) // opóźnione zamykanie programu, dla widoczności napisu pożegnalnego
						{
						}
						exit(1);
						break;
					}
					default: // użytkownik podał złą wartość w podmenu
					{
						system("cls");
						printf("Operacja nierozpoznana.\n");
					}
					}// zamknięcie switcha (wybor2)
				} while (wybor2 != 555); // powrót do menu głównego
				system("cls");
				fclose(plik);
			}
			break;
		}
		case 3:
			Czyszczenie();
			break;
		case 666: // wyjście z programu
		{
			printf("Goodbye\n");
			for (int zegar = 1; zegar <= 699999999; zegar++) // opóźnione zamykanie programu, dla widoczności napisu pożegnalnego
			{
			}
			exit(1);
			break;
		}
		default: // użytkownik podał złą wartość w menu głównym
		{
			system("cls");
			printf("Operacja nierozpoznana.\n");
		}
		} // zamknięcie switcha (wybor1)
	} while (wybor1 != 666);

		return 0;
}
0

A czemu funkcja Usuwanie jest wykomentowana? Dlaczego w tej funkcji czytasz znak po znaku, a nie całe linie za pomocą funkcji getline? Baza danych w plain text, to słaby pomysł. Użyj chociaż jakiegoś separatora do oddzielenia poszczególnych pól.

1 użytkowników online, w tym zalogowanych: 0, gości: 1