[C] Edycja rekordu w bazie danych?

0

Witam

Mam do Was pytanie jak można w bazie danych w języku C edytować rekord? Chodzi mi oczywiści o to jak zapisać to w kodzie aby dało się edytować rekord.

Mam taką funkcję:

int dodaj_kupujacego(void)

{
char wpis[INPUT]; /* Tekst wpisany przez uzytkownika */
int edit_nr; /* Wpis do edytowania */

printf("\n EDYCJA WPISU \n");

printf("\n Podaj indeks wpisu do edytowania: ");
edit_nr = atoi(gets(wpis)); /* Konwersja typu danych */

/* Nie ma takiego wpisu! */
if ((edit_nr < 1) || (edit_nr > numer))
{
printf("\n Nie ma w bazie wpisu o takim indeksie! \n");
potwierdzenie();
return EXIT_FAILURE;
}
/* Edycja wpisu */
do
{
printf("\n Telefon Marka, Model, Sim-lock: ");
gets(baza[edit_nr].telefon);
if (strlen(baza[edit_nr].telefon) > 58)
printf("\n Mozna wpisac maksymalnie 58 znakow! \n");
} while (strlen(baza[edit_nr].telefon) > 58);


do
{
printf("\n Sprzedajacy: ");
gets(baza[edit_nr].sprzedajacy);
if (strlen(baza[edit_nr].sprzedajacy) > 58)
printf("\n Mozna wpisac maksymalnie 58 znakow! \n");
} while (strlen(baza[edit_nr].sprzedajacy) > 58);

do
{
printf("\n Kupujacy: ");
gets(baza[edit_nr].kupujacy);
if (strlen(baza[edit_nr].kupujacy) > 28)
printf("\n Mozna wpisac maksymalnie 28 znakow! \n");
} while (strlen(baza[edit_nr].kupujacy) > 28);


/* Do kazdego pola dodaj znacznik konca lini */
strcat(baza[edit_nr].telefon, "\n");
strcat(baza[edit_nr].sprzedajacy, "\n");
strcat(baza[edit_nr].kupujacy, "\n");


printf("\n Wpis zostal dodany do bazy danych! \n");
potwierdzenie();
return EXIT_SUCCESS;
} 

Chodzi mi o to aby nie usuwając rekordu dopisać albo edytować wartość w baza[edit_nr].kupujacy.
Chyba że tak się nie da to napiszcie co mam źle w tym kodzie, bo niby miał on usuwać rekord i w jego miejsce nadpisac nowy, ale jak nadpisze rekord to wsadza go w kolejna komorke, np mam 3 rekordy, edytuje 1szy rekord i po edycji zapisuje sie on na 2 miejscu a ten co byl na drugim idzie na pierwsze miejsce, trzeci pozostaje na swoim miejscu.

0
Leewang1 napisał(a)

Chyba że tak się nie da to napiszcie co mam źle w tym kodzie, bo niby miał on usuwać rekord i w jego miejsce nadpisac nowy, ale jak nadpisze rekord to wsadza go w kolejna komorke, np mam 3 rekordy, edytuje 1szy rekord i po edycji zapisuje sie on na 2 miejscu a ten co byl na drugim idzie na pierwsze miejsce, trzeci pozostaje na swoim miejscu.

moze jestem zmeczony,ale ciezko mi idzie zrozumienie tego..

co do pierwotnego pytania: zakladam ze jest to baza oparta o pliki i pytasz o podmiane rekordu W PLIKU ? w takim razie: jesli dlugosc nowego rekordu jest taka sama, mozesz problemu podmienic stary na nowy. jesli dlugosci sa rozne - trzeba plik przepisac na nowe miejsce, w trakcie przepisywania podmienic rekordy (po odczytaniu starego nie wypisywac go do nowego pliku, tylko zamiast niego zapisa ten-nowy), wywalic stary plik i od tej pory uzywac nowego pliku..

jesli zas jest to baza in-memory.. erm.. to w czym problem? wymieniasz wskaznik na rekord aby pokazywal na nowy (no i powiazanych sasiadow poprawiasz jesli masz jakies), albo podmieniasz wartosci pol w starym rekordzie tak zeby wygladaly jak by byl nowy, a nowy wywalasz..

a co do samego wklejonego kodu, to ciezko cos na jego podstawie powiedziec, bo nie widac czym jest owa 'baza'.. patrzac po:

do
{
printf("\n Telefon Marka, Model, Sim-lock: ");
gets(baza[edit_nr].telefon);
if (strlen(baza[edit_nr].telefon) > 58)
printf("\n Mozna wpisac maksymalnie 58 znakow! \n");
} while (strlen(baza[edit_nr].telefon) > 58);

domyslam sie, ze baza jest tablica pewnych struktur, zas pola tej struktury maja ograniczona dlugosc -- w tym przypadku pole telefon ma char[ok.58] ? w takim przypadku, sprawdzanie strlen(pole) po gets(pole) mija sie totalnie z celem, poniewaz zbyt dlugie dane juz zostaly do tego pola wpisane i pamiec za-tablica juz dawno zostala zniszczona :)

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