-2

1) I'm stuck with inserting and displaying the user inputs. I'm confused when to use fwrite, whether within the addRecord function or within the insert function.

2) Should I write it after I input or after the insertion?

Anyhow, my code looks like this:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>

struct book{
    char title[30];
    char author[20];
    char isbn[14]; 
    char genre[10];
    char publisher[30];
    int year;
    char synopsis[150];
    struct book *left;
    struct book *right;
};

typedef struct book catalog;
catalog *root;
FILE *fx,*fy;
int structsize=sizeof(catalog);


void addBooks(); 
void removeBooks(); 
void modify(); 
void searchBook(); 
void perTitle(); 
void perAuthor(); 
void perISBN(); 
void perGenre(); 
void displayCatalog(catalog *root); 
int ifexists(char *x); 
void insert(catalog *root,catalog *x);
catalog remove(catalog *root,catalog *x);
void menu();
void gotoxy(int x,int y);

void main(){
    root=NULL;

    fx=fopen("CAT.dat","rb+");
    if(fx==NULL){
        fx=fopen("CAT.dat","wb+");
        if(fx==NULL){
            gotoxy(22,10);
            printf("No records to show...");
            getch();
            menu();
        }
    }

    menu();
}

void menu(){
    int choice;

    system("cls");
    gotoxy(22,5);
    printf("----------WELCOME TO THE CARD CATALOG----------");
    gotoxy(22,7);
    printf("1] Add a book");
    gotoxy(22,8);
    printf("2] Remove a book");
    gotoxy(22,9);
    printf("3] Modify a book");
    gotoxy(22,10);
    printf("4] Search a book");
    gotoxy(22,11);
    printf("5] Display the catalog");
    gotoxy(22,12);
    printf("6] Exit");

    gotoxy(22,14);
    printf("Enter your choice: ");
    scanf("%d",&choice);

    switch(choice){
    case 1: addBooks();
        break;
    case 2: removeBooks();
        break;
    case 3: modify();
        break;
    case 4: searchBook();
        break;
    case 5: displayCatalog(root);
        break;
    case 6: exit(0);
    }
}

void addBooks(){
    char n;
    catalog *ptr;
    ptr=(catalog*)malloc(sizeof(catalog));
    fx=fopen("CAT.dat","ab+");
    fseek(fx,0,SEEK_END);

    system("cls");fflush(stdin);
    gotoxy(22,8);
    printf("Title: ");
    scanf("%[^\n]s",ptr->title);fflush(stdin);
    gotoxy(22,9);
    printf("Author: ");
    scanf("%[^\n]s",ptr->author);fflush(stdin);
    gotoxy(22,10);
    printf("Genre: ");
    scanf("%[^\n]s",ptr->genre);fflush(stdin);
    gotoxy(22,11);
    printf("ISBN: ");
    scanf("%[^\n]s",ptr->isbn);fflush(stdin);
    gotoxy(22,12);
    printf("Publisher: ");
    scanf("%[^\n]s",ptr->publisher);fflush(stdin);
    gotoxy(22,13);
    printf("Year: ");
    scanf("%d",&ptr->year);fflush(stdin);
    gotoxy(22,14);
    printf("Synopsis: ");
    scanf("%[^\n]s",ptr->synopsis);fflush(stdin);
    ptr->left=NULL;
    ptr->right=NULL;

    if(root==NULL){
        root=ptr;
    } else {
        insert(root,ptr);
    }

    gotoxy(22,18);
    printf("Add another (y/n)? ");
    scanf("%c",&n);
    if(n=='y' || n=='Y'){
        addBooks();
    }

    fclose(fx);
    getch();
    menu();
}

void insert(catalog *root,catalog *x){
    fx=fopen("CAT.dat","ab+");
    fseek(fx,0,SEEK_END);

    if((x->isbn) < (root->isbn)){
        if(root->left==NULL){
            root->left=x;
        } else {
            insert(root->left,x);
        }
    }

    if((x->isbn) > (root->isbn)){
        if(root->right==NULL){
            root->right=x;
        } else {
            insert(root->right,x);
        }
    }

    fwrite(&x,structsize,1,fx);

    fclose(fx);
    getch();
}

void removeBooks(){
    catalog *ptr,*temp;
    int x;
    char title[20],y;

    system("cls");

    if(root==NULL){
        gotoxy(22,10);
        printf("No records to show...");
        getch();
        menu();
    }

    gotoxy(22,10);
    printf("Enter title of book to delete: ");
    scanf("%s",title);

    ptr=root;
    while(ptr!=NULL){
        if(strcmp(ptr->title,title)==0){
            gotoxy(22,11);
            printf("The book is in the catalog.");
            gotoxy(22,12);
            printf("Title: %s",root->title);
            gotoxy(22,13);
            printf("Author: %s",root->author);
        } else {
            gotoxy(22,11);
            printf("No book with that title in the catalog.");
            getch();
            menu();
        }

        if(strcmp(ptr->title,title)==0){
            gotoxy(22,14);
            printf("Remove book record? (y/n) ");
            if(getch()=='y'){
                remove(root,ptr);
                menu();
            } else {
                menu();
            }
        }
    }
}

catalog remove(catalog *root,catalog *x){
    catalog *temp;
    char y;

    if(x==root){
        temp=root;
        free(temp);
        root=NULL;
    } else if(x->isbn < root->isbn){
        *root->left=remove(root->left,x);
    } else if(x->isbn > root->isbn){
        *root->right=remove(root->right,x);
    } else if(root==NULL){
        gotoxy(22,10);
        printf("Nothing to remove...");
        getch();
        menu();
    }

    printf("The book has been removed.");
    printf("Remove another book? (y/n) ");
    scanf("%c",&y);

    return *x;
}

void modify(){
    catalog *ptr;
    int num;
    char title[20];

    system("cls");

    if(root==NULL){
        gotoxy(22,10);
        printf("No records exist...");
        getch();
        menu();
    }

    printf("Enter title of book to be modified: ");
    scanf("%s",title);

    ptr=root;
    while(ptr!=NULL){
        if(strcmp(ptr->title,title)==0){
            printf("Input new information.");
            printf("Title: ");
            scanf("%s",root->title);
            printf("Author: ");
            scanf("%s",root->author);
            printf("ISBN: ");
            scanf("%d",root->isbn);
            printf("Publisher: ");
            scanf("%s",root->publisher);
            printf("Year: ");
            scanf("%d",root->year);
            printf("Synopsis: ");
            scanf("%s",root->synopsis);

            printf("The book's information has been modified.");
        } else {
            printf("No book found.");
            break;
        }
    }

    getch();
    menu();
}

void searchBook(){
    int choice;
    char title[20], author[20];
    int num;

    system("cls");

    if(root==NULL){
        printf("No records to show...");
        getch();
        menu();
    }

    gotoxy(22,10);
    printf("-----SEARCH A BOOK-----");
    gotoxy(22,12);
    printf("1] By title");
    gotoxy(22,13);
    printf("2] By author");
    gotoxy(22,14);
    printf("3] By ISBN");
    gotoxy(22,15);
    printf("4] Back to menu");
    gotoxy(22,18);
    printf("Enter your choice: ");
    scanf("%d",&choice);

    switch(choice){
    case 1: perTitle();
        break;
    case 2: perAuthor();
        break;
    case 3: perISBN();
        break;
    case 4: perGenre();
        break;
    case 5: menu();
    }
}

void perTitle(){
    catalog *ptr;
    char title[20], temp[20], ans;

    system("cls");
    gotoxy(22,15);
    printf("Enter book title: ");
    scanf("%s",title);fflush(stdin);

    ptr=root;
    while(ptr!=NULL){
        while(strcpy(temp,ptr->title)){
            if(strcmp(temp,title)==0){
                system("cls");
                gotoxy(22,10);
                printf("That book is in the catalog.");
                gotoxy(22,11);
                printf("Title: %s",ptr->title);
                gotoxy(22,12);
                printf("Author: %s",ptr->author);
                gotoxy(22,13);
                printf("ISBN: %d",ptr->isbn);
                gotoxy(22,14);
                printf("Genre: %s",ptr->genre);
                gotoxy(22,15);
                printf("Publisher: %s",ptr->publisher);
                gotoxy(22,16);
                printf("Year: %d",ptr->year);
                gotoxy(22,17);
                printf("Synopsis: %s",ptr->synopsis);fflush(stdout);
                break;
            } else {
                gotoxy(22,10);
                printf("No records to show...");
            }
        }

        printf("Try another? (y/n) ");
        scanf("%c",&ans);fflush(stdin);

        switch(ans){
        case 'y': searchBook();
            break;
        case 'n': menu();
        }
    }
}

void perAuthor(){
        catalog *ptr;
        char author[20],au[20],ans;

        system("cls");
        gotoxy(22,15);
        printf("Enter author's name: ");
        scanf("%s",author);fflush(stdin);

        ptr=root;

        while(ptr!=NULL){
        while(strcpy(au,ptr->title)){
            if(strcmp(au,author)==0){
            system("cls");
            gotoxy(22,10);
            printf("That book is in the catalog.");
            gotoxy(22,11);
            printf("Title: %s",ptr->title);
            gotoxy(22,12);
            printf("Author: %s",ptr->author);
            gotoxy(22,13);
            printf("ISBN: %d",ptr->isbn);
            gotoxy(22,14);
            printf("Genre: %s",ptr->genre);
            gotoxy(22,15);
            printf("Publisher: %s",ptr->publisher);
            gotoxy(22,16);
            printf("Year: %d",ptr->year);
            gotoxy(22,17);
            printf("Synopsis: %s",ptr->synopsis);
        } else {
            gotoxy(22,10);
            printf("No records to show...");
        }

        printf("Try another? (y/n) ");
        scanf("%c",&ans);

        switch(ans){
        case 'y': searchBook();
            break;
        case 'n': menu();
            }
        }
    }
}

void perISBN(){
        catalog *ptr;
        char isbn[20];
        char ans;

        system("cls");
        gotoxy(22,15);
        printf("Enter book ISBN: ");
        scanf("%s",isbn);fflush(stdin);

        ptr=root;
        while(ptr->isbn==isbn){
            ptr=ptr->left;
            if(ptr==NULL)
                menu();
        }

        system("cls");
        if(ptr!=NULL){
            gotoxy(22,10);
            printf("That book is in the catalog.");
            gotoxy(22,11);
            printf("Title: %s",ptr->title);
            gotoxy(22,12);
            printf("Author: %s",ptr->author);
            gotoxy(22,13);
            printf("ISBN: %d",ptr->isbn);
            gotoxy(22,14);
            printf("Genre: %s",ptr->genre);
            gotoxy(22,15);
            printf("Publisher: %s",ptr->publisher);
            gotoxy(22,16);
            printf("Year: %d",ptr->year);
            gotoxy(22,17);
            printf("Synopsis: %s",ptr->synopsis);
        } else {
            gotoxy(22,10);
            printf("No records to show...");
        }

        printf("Try another? (y/n) ");
        scanf("%c",&ans);

        if(ans=='y' || ans=='Y'){
            searchBook();
        }

        getch();
        menu();
    }

void perGenre(){
        catalog *ptr;
        char genre[20],ans;
        char gen[10];

        system("cls");
        gotoxy(22,15);
        printf("Enter book title: ");
        scanf("%s",genre);

        ptr=root;
        while(strcmp(ptr->genre,genre)!=0){
            ptr=ptr->left;
            if(ptr==NULL)
                menu();
        }

        system("cls");
        if(ptr!=NULL){
            gotoxy(22,10);
            printf("That book is in the catalog.");
            gotoxy(22,11);
            printf("Title: %s",ptr->title);
            gotoxy(22,12);
            printf("Author: %s",ptr->author);
            gotoxy(22,13);
            printf("ISBN: %d",ptr->isbn);
            gotoxy(22,14);
            printf("Genre: %s",ptr->genre);
            gotoxy(22,15);
            printf("Publisher: %s",ptr->publisher);
            gotoxy(22,16);
            printf("Year: %d",ptr->year);
            gotoxy(22,17);
            printf("Synopsis: %s",ptr->synopsis);
        } else {
            gotoxy(22,10);
            printf("No records to show...");
        }

        printf("Try another? (y/n) ");
        scanf("%c",&ans);

        switch(ans){
        case 'y': searchBook();
            break;
        case 'n': menu();
        }
    }

void displayCatalog(catalog *root){
        catalog *ptr;
        system("cls");
        fx=fopen("CAT.dat","rb+");
        rewind(fx);

        ptr=root;
        while(fread(&ptr,structsize,1,fx)==1){
            if(root->left!=NULL){
                displayCatalog(root->left);
            }
            printf("Title: %s\n",ptr->title);
            printf("Author: %s\n",ptr->author);
            printf("ISBN: %s\n",ptr->isbn);
            printf("Genre: %s\n",ptr->genre);
            printf("Publisher: %s\n",ptr->publisher);
            printf("Year: %d\n",ptr->year);
            printf("Synopsis: %s\n",ptr->synopsis);
            if(root->right!=NULL){
                displayCatalog(root->right);
            }
            break;
        }

        fclose(fx);
        getch();
        menu();
}

void gotoxy(int x,int y){
        COORD coord;
        coord.X=x;
        coord.Y=y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    }
  • 2
    You seem to have missed the "minimal" part when creating your [**Minimal**, Complete, and Verifiable Example](http://stackoverflow.com/help/mcve). This is simply way to much code. – Some programmer dude Oct 09 '16 at 10:22
  • @JoachimPileborg Hmm, you mean I can merge functions that are similar? What do you mean? Sorry I sound stupid, I'm still starting with BST and file handling. – Ruby Sparks Oct 09 '16 at 10:31
  • Please see: [ask]. – Paul R Oct 10 '16 at 07:33
  • 1
    Also, duplicate (same user, yesterday): http://stackoverflow.com/questions/39939493/can-anyone-help-me-with-my-library-catalog-c-program - OP seems to have ignored much of the advice from the previous questions's accepted answer. – Paul R Oct 10 '16 at 07:33

1 Answers1

1

1) You have either turned off all the compiler warnings or you have elected to ignore about 100 compiler warnings.

You should start over, set compiler warning to maximum, or at least 4. Write the program so it compiles with zero warnings.

Few notable errors:

scanf("%d",root->isbn);

isbn is character array, so this should read scanf("%s",root->isbn);

scanf("%d", root->year); 

scanf requires address of variable, not copy. It should be scanf("%d", &root->year);

You have many other errors, for example in void modify you try to access uninitialized pointer ptr.

2) You have this gotoxy function, it makes things look very nice, but you should remove it, given that your program does not work at all. If you get your program working without error then you can put back these decorative functions.

3) Try to avoid global variables. FILE *fx, *fy; specially cause problems. You have file handles which are left open, then you try to open them again in a different mode.

catalog *root; is not allocated. The whole program seems to rest on this variable, this will go nowhere. For example

void perTitle() 
{
    catalog *ptr;
    ...
    ptr = root;
    while (ptr != NULL) 
    {
        while (strcpy(temp, ptr->title)) 
        {
            ...
        }
    }
}

This may look like a search function but it's just while(0){}, it doesn't do anything.

4) It seems you are managing the records in file, and also storing them in a linked list. This gets very confusing. You should do one or the other. I recommend you store the records in file. Read them in to linked list. And then save them in to file when finished.

5) Use more functions to avoid typing the same thing. For example write a new function showBook

void showBook(catalog *ptr)
{
    printf("Title: %s\n", ptr->title);
    printf("Author: %s\n", ptr->author);
    printf("ISBN: %s\n", ptr->isbn);
    printf("Genre: %s\n", ptr->genre);
    printf("Publisher: %s\n", ptr->publisher);
    printf("Year: %d\n", ptr->year);
    printf("Synopsis: %s\n", ptr->synopsis); 
}

You can reuse this function in perTitle(), perAuthor(), perISBN(), perGenre() and elsewhere.

6) Initialize data to zero, example:

catalog *ptr = malloc(sizeof(catalog));
memset(ptr, 0, sizeof(catalog));

Start with a small program. Add a few simple function, test it, add more functions. You may want to write a separate test program to test linked lists. Example

void getBook(catalog *ptr)
{
    printf("Title:\n");
    scanf("%s", ptr->title);
    printf("Author:\n");
    scanf("%s", ptr->author);
    printf("Genre:\n");
    scanf("%s", ptr->genre);
    printf("ISBN:\n");
    scanf("%s", ptr->isbn);
    printf("Publisher:\n");
    scanf("%s", ptr->publisher);
    printf("Year:\n");
    scanf("%d", &ptr->year);
    printf("Synopsis:\n");
    scanf("%s", ptr->synopsis);
}

void addBooks() 
{
    catalog cat;
    memset(&cat, sizeof(catalog), 0);
    getBook(&cat);
    FILE* fx = fopen("CAT.dat", "ab+");
    fseek(fx, 0, SEEK_END);
    fwrite(ptr, structsize, 1, fx);
    fclose(fx);
    printf("Add another (y/n)?\n");

    char n;
    scanf("%c", &n);
    if (n == 'y' || n == 'Y') 
        addBooks();

    _getch();
    menu();
}

void displayCatalog()
{
    system("cls");
    FILE* fx = fopen("CAT.dat", "rb+");
    catalog cat;
    while (fread(&cat, sizeof(catalog), 1, fx) == 1)
    {
        showBook(&cat);
        break;
    }
    fclose(fx);
    _getch();
    menu();
}

void menu() 
{
    int choice;
    system("cls");
    printf("----------WELCOME TO THE CARD CATALOG----------\n");
    printf("1] Add a book\n");
    printf("2] Remove a book\n");
    printf("3] Modify a book\n");
    printf("4] Search a book\n");
    printf("5] Display the catalog\n");
    printf("6] Exit\n");
    printf("Enter your choice: \n");
    scanf("%d", &choice);

    switch (choice) 
    {
    case 1: addBooks(); break;
    case 2: removeBooks(); break;
    case 3: modify(); break;
    case 4: searchBook(); break;
    case 5: displayCatalog(); break;
    case 6: exit(0);
    }
}

int main() 
{
    FILE *f = fopen("CAT.dat", "rb+");
    if (f == NULL)
    {
        f = fopen("CAT.dat", "wb+");
        if (f == NULL)
        {
            printf("Cannot create new file...\n");
            return 0;
        }
    }
    fclose(f);
    menu();
    return 0;
}
Barmak Shemirani
  • 30,904
  • 6
  • 40
  • 77