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;
}