Witam,
Mam problem z prostą bazą danych w c. Udało mi się zrobić wczytywanie bazy danych, dopisywanie do bazy danych no i wczytywanie całej bazy danych. Chciłbym jednak wyświetlać rekord po rekordzie a coś mi niestety z tym nie idzie- pewnie cos źle mam z wskażnikami do pliku - ale dla mnie to prawie jak czarna magia... Jeśli byłby ktoś tak miły i pomógł mi z tym wyświetlaniem rekord po rekordzie byłbym wdzięczny. Zastanawiam sie również jak edytować daną baze danych - tzn jak zamienić jeden element tablicy w pliku na inny element czyli w moim przypadku zamiast np. Wpisanej marki BMW wpisać Mercedes.Jeśli byłby ktoś tak miły i pomógł mi z wyżej wymienionymi problemami byłbym wdzięczny.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct samochody
{
int ID;
char marka[20];
char model[20];
int rok_produkcji;
double cena;
};
struct samochody auta[20],bufs;
int wczytywanie();
int drukowanie();
int dopisywanie();
int h;
FILE *fp;
int main()
{
char n;
printf("Witaj przybyszu!");
printf("\nW dzisiejszym programie masz do wyboru nastepujace mozliwosci");
printf("\n1-tworzenie nowej bazy danych\n2-drukowanie istniejacej bazy danych\n3-dodawanie do istniejacej bazy danych");
do{
printf("\nTwoj wybor to?");
n=getch();
fflush(stdin);
switch(n)
{
case '1' : wczytywanie();
break;
case '2' : drukowanie();
break;
case '3' : dopisywanie();
break;
case '9' : exit(1);
break;
case 27 : exit(1);
break;
default : printf("\n nie ma takiej opcji, wybierz jeszcze raz");
break;
}
}while(n!='1'&&n!='2'&&n!='3'&&n!=9&&n!=27);
}
int wczytywanie()
{
fp=fopen("baza aut.txt","w+");
int i=0,rozmiar;
char t,n;
do
{
printf("podaj marke samochodu:");
scanf("%s",&auta[i].marka);
printf("\npodaj model samochodu:");
scanf("%s",&auta[i].model);
printf("\npodaj rok produkcji samochodu:");
scanf("%d",&auta[i].rok_produkcji);
printf("\npodaj cene samochodu:");
scanf("%lf",&auta[i].cena);
auta[i].ID=i+1;
fwrite(&auta[i],sizeof(auta),1,fp);
i++;
rozmiar=i;
printf("\nCzy chcesz wpisac do bazy jeszcze jeden rekord? (t=tak)\n");
t=getch();
}while (t=='t');
fclose(fp);
printf("\nAby przejsc do menu wcisnij 1, aby wyjsc wcisnij dowolny klawisz\n");
n=getch();
fflush(stdin);
switch(n)
{
case '1' : main();
break;
case 27 : exit(1);
break;
default : exit(1);
break;
}
}
int drukowanie()
{
fp=fopen("baza aut.txt","r+");
int y,j,n,i,d,g,rozmiar;
char z;
fseek(fp,0,SEEK_END);
rozmiar=ftell(fp)/sizeof(auta);
fseek(fp,0,0);
d=0;
g=1;
for(h=0;h<rozmiar;h++)
{
system("cls");
fread(&auta,sizeof(auta),1,fp);
for(j=d;j<g;j++)
{
printf("opis %d auta:",j+1);
for (n=0;n<1;n++)
{
printf("\nnumer ID samochodu:%d",auta[n].ID);
printf("\nmarka samochodu:%s",auta[n].marka);
printf("\nmodel samochodu:%s",auta[n].model);
printf("\nrok produkcji samochodu:%d",auta[n].rok_produkcji);
printf("\ncena samochodu:%lf",auta[n].cena);
}
}
printf("\n1-edytuj 2-usun 3-Home 4-End 5-Page Up 6-Page Down");
do{
z=getch();
y=z;
switch(y)
{
case '1' : edytuj();
break;
/*case '2' : usun();
break;*/
case '3' :
fseek(fp,0,0);
d=0;
g=1;
break;
case '4' :
fseek(fp,-1*sizeof(auta),2);
d=rozmiar-1;
g=rozmiar;
break;
case '5' :
fseek(fp,(h+1)*sizeof(auta),0);
if(g>rozmiar-2&&g<rozmiar)
{
d=rozmiar-1;
g=rozmiar;
}
else
{
d++;
g++;
}
break;
case '6' :
fseek(fp,-(h+1)*sizeof(auta),2);
if(d<1)
{
d=0;
g=1;
}
else
{
d--;
g--;
}
break;
case 27 : exit(1);
break;
default : printf("\nnie ma takiej opcji, wybierz jeszcze raz");
break;
}
}while(y!=27&&y!=1&&y!=2&&y!=3&&y!=4&&y!=5&&y!=6);
}
fclose(fp);
}
int dopisywanie()
{
fp=fopen("baza aut.txt","a+");
int i;
char t,n;
fseek(fp,0,SEEK_END);
i=ftell(fp)/sizeof(auta);
fseek(fp,0,SEEK_END);
do
{
printf("podaj marke samochodu:");
scanf("%s",&auta[i].marka);
printf("\npodaj model samochodu:");
scanf("%s",&auta[i].model);
printf("\npodaj rok produkcji samochodu:");
scanf("%d",&auta[i].rok_produkcji);
printf("\npodaj cene samochodu:");
scanf("%lf",&auta[i].cena);
auta[i].ID=i+1;
fwrite(&auta[i],sizeof(auta),1,fp);
i++;
printf("\nCzy chcesz wpisac do bazy jeszcze jeden rekord? (t=tak)\n");
t=getch();
}while (t=='t');
fclose(fp);
printf("\nAby przejsc do menu wcisnij 1, aby wyjsc wcisnij dowolny klawisz\n");
n=getch();
fflush(stdin);
switch(n)
{
case '1' : main();
break;
case 27 : exit(1);
break;
default : exit(1);
break;
}
}
int edytuj(int h)
{
char a;
int b;
fp=fopen("baza aut.txt","r+");
do{
printf("\n1-edytuj marke auta 2-edytuj model auta 3-edytuj rok produkcji auta 4-edytuj cene auta");
a=getch();
b=a;
switch(b)
{
case '1' :
printf("\npodaj nowa marke:");
scanf("%s",&auta[h].marka);
fwrite(&auta[h],(h+1)*sizeof(auta),1,fp);
break;
case '2' :
printf("\npodaj nowy model:");
scanf("%s",&auta[h].model);
fwrite(&auta[h],(h+1)*sizeof(auta),1,fp);
break;
case '3' :
printf("\npodaj nowy rok produkcji:");
scanf("%s",&auta[h].rok_produkcji);
fwrite(&auta[h],(h+1)*sizeof(auta),1,fp);
break;
case '4' :
printf("\npodaj nowa cene:");
scanf("%s",&auta[h].cena);
fwrite(&auta[h],(h+1)*sizeof(auta),1,fp);
break;
case 27 : exit(1);
break;
default : printf("\nnie ma takiej opcji");
break;
}
}while(b!=1&&b!=2&&b!=3&&b!=4&&b!=27);
drukowanie();
}