C - Как отобразить и удалить данные из файла .txt - PullRequest
0 голосов
/ 20 декабря 2018

В приведенном ниже коде я пытаюсь вставить, отобразить и удалить данные из файла file.txt.Я могу вставить успешно, но моя функция отображения не отображается правильно, и я не знаю, как настроить логику для функции удаления.Я был бы признателен за помощь в изменении кода, чтобы он мог работать.Как я могу настроить логику для этого?

#include <stdio.h>

void menu() {
    printf("Option 1 - Create a file and insert data:\n");
    printf("Option 2 - Read file and display:\n");
    printf("Option 3 - Delete content:\n");
    printf("Option 4 - Exit:\n");
};

struct Book {
    char title[256];
    char author[256];
    int pages;
    int price;
};

void get() {

        struct Book *book;
        book = (struct Book*)malloc(sizeof(struct Book));

        FILE *fPtr;

        fPtr = fopen("file.txt", "w");

        if (fPtr == NULL) {
            printf("Fail creating file");
            getch();
            exit(1);
        };


        for (int i = 0; i < 1; i++) {
            printf("Enter the  book title:\n");
            scanf("%s", &book[i].title);
            fprintf(fPtr, "Title = %s", book[i].title);

            printf("Enter the author of the book:\n");
            scanf("%s", &book[i].author);
            fprintf(fPtr, "Author = %s", book[i].author);

            printf("Enter the number of pages:\n");
            scanf("%d", &book[i].pages);
            fprintf(fPtr, "Pages = %d", book[i].pages);

            printf("Enter the price:\n");
            scanf("%d", &book[i].price);
            fprintf(fPtr, "Price = %d", book[i].price);
        };

        /*for (int i = 0; i < 1; i++) {
            printf("%s\n", book[i].title);
            printf("%s\n", book[i].author);
            printf("%d\n", book[i].pages);
            printf("%d\n", book[i].price);
        };*/

        fclose(fPtr);
};

void display() {
    FILE *fPtr;
    fPtr = fopen("file.txt", "r");

    printf("The content of file are:\n", fPtr);

    /*struct Book *book;

    book = (struct Book*)malloc(sizeof(struct Book));


    printf("%s %s %d %d", book.title, book.author, book.pages, book.price);*/

    free(book);
    fclose(fPtr);
}



int main()
{
    int opt = 0;
    int opt2 = 0;
    int var = 0;
    int validation = 0;

    while (opt != 4) {
        menu();
        do
        {
            printf("Choose an option:\n");
            validation = scanf_s("%d", &opt);
            while (getchar() != '\n');
        } while (validation != 1);

        switch (opt) {
        case 1:
            get();
            printf("Option 5 - Display data:\n");
            printf("Option 6 - Delete:\n");
            scanf("%d", &var);
            if (var == 5) {
                //FILE *fp1;
                /*fp1 = fopen("file.txt", "r");*/
                display();
            }
            else if (var == 6) {
                printf("delete!");
            }
            break;
        case 2:
            printf("First insert data:\n");
            break;
        case 3:
            printf("First insert data:\n");
            break;
        case 4:
            return 0;
        }
    }

}

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

примечание: дисплей () предложение 2

 void display() {
    FILE *fp;
    fp = fopen("file.txt", "r");

    struct Book book;


    printf("%s %s %d %d", book.title, book.author, book.pages, book.price);

    free(book);
    fclose(fp);
}
0 голосов
/ 20 декабря 2018

"get (); предложение 2"

void get() {


        FILE *fPtr;

        fPtr = fopen("file.txt", "w");

        struct Book book;

        if (fPtr == NULL) {
            printf("Fail creating file");
            getch();
            exit(1);
        };

        printf("Enter the  book title:\n");
        scanf("%s", &book.title);
        fprintf(fPtr, "%s", book.title);

        printf("Enter the author of the book:\n");
        scanf("%s", &book.author);
        fprintf(fPtr, "%s", book.author);

        printf("Enter the number of pages:\n");
        scanf("%d", &book.pages);
        fprintf(fPtr, "%d", book.pages);

        printf("Enter the price:\n");
        scanf("%d", &book.price);
        fprintf(fPtr, "%d", book.price);

        /*for (int i = 0; i < 1; i++) {
            printf("%s\n", book[i].title);
            printf("%s\n", book[i].author);
            printf("%d\n", book[i].pages);
            printf("%d\n", book[i].price);
        };*/

        fclose(fPtr);
};
0 голосов
/ 20 декабря 2018

Я рекомендую вам переименовать Книги в Книгу , поскольку struct управляет одной книгой, а не несколькими.

О кодах команд длявведите вместо 1 .. 4 как насчет «c» для создания, «r» для чтения, «d» для удаления и «e» для выхода?

Относительно get():

  • у вас утечка памяти, потому что выделенные Книги не освобождены.Это распределение бесполезно, лучше иметь struct Book book;
  • for (int i = 0; i < 1; i++) бесполезно и эквивалентно int i = 0, вы действительно управляете только 1 книгой?
  • в вашем fprintf переместите '\ n' от начала до конца, иначе ваш файл начинается с пустой строки, а последняя строка не заканчивается
  • Нужно ли ставить префиксы для каждого типа данных, например Title =?Читать содержимое файла сложнее с этими префиксами

Относительно display():

  • вы не читаете содержимое файла, поэтому сложно отобразить его:)
  • Вы выделяете Книгу, не инициализируете ее, но пишете ее (неинициализированные) поля
  • for (int i = 0; i < 1; i++) бесполезны и эквивалентны int i = 0
  • у вас естьутечка памяти, потому что выделенные книги не освобождаются.Это распределение бесполезно, лучше иметь struct Book book;

Относительно display():

  • вы не читаете содержимое файла, поэтому сложно отобразить его:)
  • Вы выделяете Книгу, не инициализируете ее, но пишете ее (неинициализированные) поля
  • for (int i = 0; i < 1; i++) бесполезны и эквивалентны int i = 0
  • у вас естьутечка памяти, потому что выделенные книги не освобождаются.Это распределение бесполезно, лучше иметь struct Book book;

Относительно deleteStudentRecord():

  • getNoOfRecords() не определено, но в настоящее время оно должно возвращать 1, потому что вы управляететолько одна книга в файле
  • var не определена, а также ptr
  • open file2 с "w",это новый файл
  • fread(&var, sizeof(struct student), 1, ptr) неверен, поскольку предполагает, что строка всегда имеет sizeof(struct student), но это не тот случай, когда ссылаются на get()
  • fcloseall() ???просто сделайте fclose(ptr); и fclose(ptr2), переименуйте их в fpIn и fpOut, или что-то подобное сделает ваш код более читабельным
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...