Allister
Allister

Reputation: 851

C - File I/O, not reading from file

Hey! I am currently doing some prep for my upcoming college assignment but am facing some difficulties.

I have to write an C database application that will store book details into a file, and allow me to recall them and delete them. I am having some problem with reading the file, the entries just won't show when I list them all (Option 3).

I have had a look at the database file so I think it has been written to correctly.

Here is the basic function of my code:

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

// Global Varables
FILE *fp, *ft;

// Structs
typedef struct Books
{
    int id;
    char title[25];
    char forename[25];
    char surname[25];
    char isbn[13];
}Books;

void displayMenu()
{
    printf("Options");
}

void runapp()
{
    int option;
    char isbn[20];
    char deleteOrNot[2];
    Books book;

    fp = fopen("database.dat", "a+");
    if (fp == NULL)
    {
        printf("Failed to open file.");
    }

    long int booksize = sizeof(book);

    do
    {
        displayMenu();
        printf("Enter menu option: ");
        scanf("%i", &option);

        switch(option)
        {
            // =================================================================
            // -------- OPTION 1: Add a new book
            // =================================================================
            case 1:
                fseek(fp, 0, SEEK_END);

                printf("Please enter the books title: ");
                scanf("%s", book.title);
                printf("Please enter the authors first name: ");
                scanf("%s", book.forename);
                printf("Please enter the authors surname: ");
                scanf("%s", book.surname);
                printf("Please enter the ISBN number: ");
                scanf("%s", book.isbn);

                fwrite(&book, booksize, 1, fp);
                fflush(stdin);

            break;
            // =================================================================
            // -------- OPTION 2: Search and delete
            // =================================================================
            case 2:
               // Search and delete 
            break;
            // =================================================================
            // -------- OPTION 3: List all books
            // =================================================================
            case 3:
                rewind(fp);
                while(fread(&book, booksize,1, fp))
                    printf("%s", book.title);

                printf("\n\nPress any key to return to menu.");
                getch();
            break;
            // =================================================================
            // -------- OPTION 4: Exit the application
            // =================================================================
            case 4:
                fclose(fp);
                exit(0);
            break;
        }
        if (system("cls")) system("clear");
    }while(option != "\n");
}


int main()
{
    runapp();
    return 0;
}

Any help with solving this problem would be great!

Also feel free to give me some tips on my code.

Upvotes: 1

Views: 281

Answers (4)

Adrian McCarthy
Adrian McCarthy

Reputation: 48038

You're trying to write the book structure directly to and from the file rather than a textual representation of the data, so you need to open the file in binary mode, (add b to the a+ in the fopen call). Otherwise your data could be slightly corrupted as the i/o library tries to translate carriage returns and line feeds to and from your host computer's preferred convention.

Upvotes: 0

William Pursell
William Pursell

Reputation: 212654

Try adding:

 fflush( stdout );

Upvotes: 1

codaddict
codaddict

Reputation: 455440

In main you are doing the following which is incorrect:

int option;
....
}while(option != "\n");

Upvotes: 1

Algorithmist
Algorithmist

Reputation: 6695

Are you able to perform other operations as in your code you have written

scanf("%i", &option);

Which appears to be wrong as the format specifier should be %d instead of %i.

Upvotes: 0

Related Questions