Program-baza danych.
Program miał umożliwiać dodawanie własnych rekordów ręcznie, z pliku, zapis danych w pliku, usuwanie rekordów.
Błędy:
- nie działająca funkcja usun(E0020 identyfikator "tytul" jest niezdefiniowany projekt_1 )
- przy ręcznym dodaniu rekordu i wyświetleniu go pojawia się tylko pozycja tytul
- po użyciu funkcji dodania rekordów z pliku program wyłącza się
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef N
#define N 50
#endif
typedef struct nagranie {
char tytul[50];
char wykonawca[50];
char rok[10];
char gatunek[50];
char wytwornia[50];
int strona;
} nagranie;
void menu(int x)
{
if (x == 1) {
printf("Wprowadź numer operacji i potwierdź klawiszem enter.\n");
}
if (x == 0) {
printf("Wybierz co chcesz zrobić dalej:\n");
}
printf("1. Dodaj rekordy.\n");
printf("2. Dodaj rekordy z pliku.\n");
printf("3. Wyswietl dane. \n");
printf("4. Usun rekord.\n");
printf("5. Zapisz rekordy w pliku.\n");
printf("Wcisnij 'x' aby wyjść.\n");
}
void add(nagranie nagrania[N], int* next)
{
char end[2] = "\0";
char newline[2] = " ";
int j;
int i = (*next);
int ilosc = 0;
int enter;
int count_newline;
printf("Wprowadź po kolei tytul, wykonawce, rok wydania, gatunek i wytwornie. Każdą informację potwierdź klawiszem enter.\n");
fgets(nagrania[i].tytul, 50, stdin);
count_newline = strcspn(nagrania[i].tytul, "\n");
for (j = count_newline; j < 49; j++) {
nagrania[i].tytul[j] = newline[0];
}
nagrania[i].tytul[j] = end[0];
fgets(nagrania[i].wykonawca, 50, stdin);
count_newline = strcspn(nagrania[i].wykonawca, "\n");
for (j = count_newline; j < 49; j++) {
nagrania[i].wykonawca[j] = newline[0];
}
nagrania[i].wykonawca[j] = end[0];
fgets(nagrania[i].rok, 10, stdin);
count_newline = strcspn(nagrania[i].rok, "\n");
for (j = count_newline; j < 40; j++) {
nagrania[i].rok[j] = newline[0];
}
nagrania[i].rok[j] = end[0];
fgets(nagrania[i].gatunek, 50, stdin);
count_newline = strcspn(nagrania[i].gatunek, "\n");
for (j = count_newline; j < 49; j++) {
nagrania[i].gatunek[j] = newline[0];
}
nagrania[i].gatunek[j] = end[0];
fgets(nagrania[i].wytwornia, 50, stdin);
count_newline = strcspn(nagrania[i].wytwornia, "\n");
for (j = count_newline; j < 49; j++) {
nagrania[i].wytwornia[j] = newline[0];
}
nagrania[i].wytwornia[j] = end[0];
scanf_s("%d", &nagrania[i].strona);
enter = getchar();
(*next)++;
}
void open(nagranie nagrania[N], int* next)
{
char pom[6];
char nazwa_pliku[100];
int j;
int i = (*next);
int enter;
int ilosc;
int newline;
printf("Wpisz nazwę pliku z danymi.");
scanf_s("%s", nazwa_pliku);
enter = getchar();
FILE* file = fopen_s(nazwa_pliku, "crt_fopen_s.c", "r");
if (feof(file) != 0) {
perror("Plik jest pusty.\n");
}
else {
fscanf_s(file, "%d", &ilosc);
enter = fgetc(file);
if (ilosc == 0 || i + ilosc > N) {
printf("Nie można wprowadzić tylu rekordów.\n");
}
else {
for (j = 0; j < ilosc; j++) {
fgets(pom, 6, file);
fgets(nagrania[i + j].tytul, 50, file);
fgets(nagrania[i + j].wykonawca, 50, file);
fgets(nagrania[i + j].rok, 10, file);
fgets(nagrania[i + j].gatunek, 50, file);
fgets(nagrania[i + j].wytwornia, 50, file);
fscanf_s(file, "%d", &nagrania[i + j].strona);
newline = fgetc(file);
}
(*next) = i + j;
}
}
fclose(file);
}
void wyswietl1(nagranie nagrania[N], int i)
{
printf("%-5d", i + 1);
printf("%s", nagrania[i].tytul);
printf("%s", nagrania[i].wykonawca);
printf("%s", nagrania[i].rok);
printf("%s", nagrania[i].gatunek);
printf("%s", nagrania[i].wytwornia);
printf("%d\n", nagrania[i].strona);
}
void wyswietl(nagranie nagrania[N], int* next)
{
int i;
for (i = 0; i < (*next); i++) {
wyswietl1(nagrania, i);
}
}
void zapisz(nagranie nagrania[N], int* next)
{
char nazwa_pliku[50];
int i;
int enter;
printf("Wpisz nazwę pliku, w którym mają się pojawić dane.\n");
scanf_s("%s", nazwa_pliku);
enter = getchar();
FILE* file = fopen_s(nazwa_pliku, "crt_fopen_s.c", "w+");
fprintf(file, "%d\n", (*next));
for (i = 0; i < (*next); i++) {
fprintf(file, "%-5d", i + 1);
fprintf(file, "%s", nagrania[i].tytul);
fprintf(file, "%s", nagrania[i].wykonawca);
fprintf(file, "%s", nagrania[i].rok);
fprintf(file, "%s", nagrania[i].gatunek);
fprintf(file, "%s", nagrania[i].wytwornia);
fprintf(file, "%d", nagrania[i].strona);
fprintf(file, "\n");
}
fclose(file);
}
void usun(nagranie nagrania[N], int* next)
{
int n, i;
scanf_s("%s", tytul);
for (i = 0; i < n; i++) {
if (strcmp(tytul, nagrania[i].tytul) == 0) {
nagrania[i] = nagrania[n - 1];
n--;
printf("usunieto\n");
}
}
}
int main()
{
setlocale(0, "");
int i = 0;
int enter;
int* next = malloc(sizeof(int));
(*next) = 0;
char operation;
nagranie nagrania[N];
menu(1);
scanf_s("%c", &operation);
enter = getchar();
while (operation != 'x') {
if (operation == '1') {
if (*(next) < N) {
add(nagrania, next);
}
else {
printf("Baza jest pełna, najpierw usuń rekordy.\n");
}
menu(0);
}
if (operation == '2') {
if ((*next) < N) {
open(nagrania, next);
}
else {
printf("Baza jest pełna, najpierw usuń rekordy.\n");
}
menu(0);
}
if (operation == '3') {
if ((*next) == 0) {
printf("W bazie nie ma żadnych rekordów.\n");
}
else {
printf(nagrania, next);
}
menu(0);
}
if (operation == '4') {
if ((*next) == 0) {
printf("W bazie nie ma żadnych rekordów.\n");
}
else {
usun(nagrania, next);
}
menu(0);
}
if (operation == '5') {
if ((*next) == 0) {
printf("Baza jest pusta, nie ma rekordów do zapisania.\n");
}
else {
zapisz(nagrania, next);
}
menu(0);
}
scanf_s("%c", &operation);
enter = getchar();
}
printf("Kociec.\n");
free(next);
return 0;
}