Baza danych oparta na pliku tekstowym

0

Cześć, piszę program w C, coś w stylu bazy danych. Chodzi mi o to aby dało się dodawać, wyświetlać, usuwać i sortować elementy w bazie. Program jest na takim etapie, że dodaje elementy i odczytuje - i tutaj mam problem, bo funkcja wyświetla mi tylko jeden element, a nie wszystkie które zapisałem w pliku. Tutaj moje pytanie, jak to naprawić? Z góry dzięki za pomoc.

#include <stdio.h>
#include <stdlib.h>

int Key; 
struct lib
{
	char Title[50]; 
	char Author[50];
	int PubDate;
	char Type[50];
	int Score;
} Books;

void ShowStatistics()
{
}

void DeleteElement()
{
}

void ShowHelp()
{
}

void AddElement()
{

	struct lib base;
	char c;
	database = fopen("dane.txt", "w");
	system("CLS");
	do
	{
		while(getchar()!='\n');
		printf("\n..:: DODAJ NOWĄ POZYCJĘ ::..\n");
		printf("Podaj tytuł książki: ");
		gets(base.Title);
		printf("Podaj autora : ");
		gets(base.Author);
		printf("Podaj gatunek: ");
		gets(base.Type);
		printf("Podaj datę wydania: ");
		scanf("%d", &base.PubDate);
		printf("Oceń książkę w skali 1-10: ");
		scanf("%d", &base.Score);
		fwrite ( &base, sizeof(base), 1, database );
		printf ("::::::::::::::::::::::::::::::::::::::::\n");
		printf ("Czy chcesz dodać kolejną pozycję? [Y/N].\n");
		printf ("::::::::::::::::::::::::::::::::::::::::\n");
		scanf ("%s", &c);
	}while ( c == 'Y' || c == 'y' );
	fclose( database );
}

void ShowElements()
{
	FILE *database;
	struct lib base;
	int i = 0;
	printf ( "-------------------------------------------------------\n" );
	printf ( "Tytył książki | Autor | Gatunek | Rok wydania | Ocena |\n" );
	printf ( "-------------------------------------------------------\n" );
	database = fopen( "dane.txt", "r+b" );
		fseek ( database, i*sizeof( base ), 1 );
		fread( &base, sizeof( base ), 1, database );
		printf ( "%s || %s || %s || %d || %d \n\n", base.Title, base.Author, base.Type, base.PubDate, base.Score );
		i++;
	fclose ( database );
}

void EndProgram()
{
	system("clear");
	printf("Kończę program...\n");
	{sleep(1);}
	system("clear");
}

void PrintMenu(){
	printf ("\n..:: MENU ::..\n");
	printf ("[1] Wyświetl wszystkie pozycje.\n");
	printf ("[2] Dodaj nową pozycję.\n");
	printf ("[3] Usuwanie elementów.\n");
	printf ("[4] Wyświetl statystyki biblioteki.\n");
	printf ("[5] Pomoc.\n");
	printf ("[6] Zakończ program.\n");
	printf ("\n::::::::::::::::::::::::::::::::::\n");
	printf ("Wybierz interesującą Cię akcję:\n");
	printf ("::::::::::::::::::::::::::::::::::\n");
	scanf("%d", &Key);
	switch ( Key )
	{
		case 1:
			system("clear");
			ShowElements();
			break;
		case 2:
			AddElement();
			system("clear");
			PrintMenu();
			break;
		case 3:
			DeleteElement();
			break;	
		case 4:
			ShowStatistics();
			break;
		case 5:
			ShowHelp();
			break;
		case 6:
			EndProgram();
			break;
		default:
			printf ("Wybrana opcja nie jest dozwolona.\n");
			break;
	}
}

int main()
{
	PrintMenu();
}
0

Powiem ci w tajemnice że kompilator nie jest Oraklem Delfijskim i nie jest w stanie zgadnąć że każąc mu wczytać i wyświetlić jeden rekord z pliku tak naprawdę chcesz wczytać i wyświetlić wszystkie.

0

Użyj .INI, albo obsługuj .txt na wzór .INI.

0
antimonium napisał(a):

Powiem ci w tajemnice że kompilator nie jest Oraklem Delfijskim i nie jest w stanie zgadnąć że każąc mu wczytać i wyświetlić jeden rekord z pliku tak naprawdę chcesz wczytać i wyświetlić wszystkie.

Czyli mogę użyć np. pętli żeby wyświetlić wszystkie?

@Edit
Pytanie tylko, jak to zrobić, chodzi mi o warunek pętli.

0

warunek pętli while(true), zaś zamiast fread: if(fread(...)!=1) break;

0

Dziękuję. Mam jeszcze jedno pytanie. Jak zapobiec temu, że przy dodawaniu rekordów poprzednie w pliku się kasują?

0

Wystarczy dokładniej poczytać o "operacjach na plikach tekstowych".

0

fopen(....,"a");

0

Z resztą już sobie mam nadzieję poradzę. Dziękuję bardzo wszystkim za pomoc.

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