C - Файловый ввод / вывод, не читающий из файла - PullRequest
1 голос
/ 12 марта 2011

Эй! В настоящее время я готовлюсь к предстоящему поступлению в колледж, но сталкиваюсь с некоторыми трудностями.

Мне нужно написать приложение базы данных C, которое будет хранить детали книги в файле и позволять мне вызывать их и удалять. У меня возникли некоторые проблемы с чтением файла, записи просто не будут отображаться, когда я перечислю их все (Вариант 3).

Я посмотрел файл базы данных, поэтому я думаю, он был записан правильно.

Вот основная функция моего кода:

#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;
}

Любая помощь в решении этой проблемы была бы великолепна!

Также не стесняйтесь дать мне несколько советов по моему коду.

Ответы [ 4 ]

1 голос
/ 12 марта 2011

В main вы делаете следующее, что неверно:

int option;
....
}while(option != "\n");
1 голос
/ 12 марта 2011

Попробуйте добавить:

 fflush( stdout );
0 голосов
/ 12 марта 2011

Вы пытаетесь записать структуру book непосредственно в файл и из файла, а не в текстовое представление данных, поэтому вам нужно открыть файл в двоичном режиме (добавьте b к a+ в fopen вызове). В противном случае ваши данные могут быть слегка повреждены, поскольку библиотека ввода-вывода попытается преобразовать возврат каретки и перевод строки в предпочтительное соглашение вашего хост-компьютера.

0 голосов
/ 12 марта 2011

Можете ли вы выполнять другие операции, как в написанном вами коде

scanf("%i", &option);

Что неверно, поскольку спецификатор формата должен быть% d вместо% i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...