Структурка. Как убрть пустую строку. Помогите пофиксить

Есть код: Нужно подкоректировать его так что бы строка полностью была чиста без символов или букв. И если реально возможно то удалить её просто(пустую строку). Посмотрите скрин, как убрать оттуда число что это вообще как оно там появилось

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

struct
{
    char author[50]; // автор
    char name[50]; // название книги
    short int year; // рік видання
    char language[50]; // мова програмування
} book;

FILE *fp;

int main()
{
    system("chcp 1251");
    system("cls");
    char key;
    
    do {
        system("cls");
        printf("1 - Создание новой записи\n");
        printf("2 - Просмотр всех записей\n");
        printf("3 - Поиск записей\n");
        printf("4 - Удаление записи\n");
        printf("0 - Выход\n");
        key = getch();
        system("cls");
        
        switch (key)
        {
            case '1': include(fp); break;
            case '2': print(fp); break;
            case '3': search(fp); break;
            case '4': del(fp); break;
        }
        
        system("pause");
    } while (key != '0');
    
    return 0;
}

void include(FILE *fp)
{
    fp=fopen("database.dat","ab");
    char otvet = 'y';
    
    do {
        printf("Введите название книги: ");
        scanf("%s", book.name);

        printf("Введите автора книги: ");
        scanf("%s", book.author);

        printf("Введите год издания книги: ");
        scanf("%d", &book.year);

        printf("Введите по какому языку книга: ");
        scanf("%s", &book.language);

        fwrite(&book, sizeof(book), 1, fp);
        printf("\nДанные записаны в файл.");
        printf("Хотите добавить ещё кингу? [y - да / n - нет]\n\n");
        otvet = getch();
    } while (otvet != 'n');
    
    fclose(fp);
}

void print(FILE *fp)
{
    int i = 1;
    
    fp=fopen("database.dat","rb");
    printf("---------------------------------------------------------------------------------------------\n");
    printf("№ Название книги: Автор книги: Год издания книги: Язык программирования книги:\n");
    printf("---------------------------------------------------------------------------------------------\n");
    
    while (fread(&book, sizeof(book), 1, fp))
    {
        printf("%d %7s %16s %16d %23s\n", i, book.name, book.author, book.year, book.language);
        i++;
    }
    
    fclose(fp);
    printf("\n");
}

void search(FILE *fp)
{
    fp=fopen("database.dat","rb+");
    char name[30], k=0;
    
    printf("Введите язык программирования по которому вы хотите найти книгу(и): ");
    scanf("%s", &name);
    printf("Результат поиска:\n");
    printf("-----------------------------------------------------------\n");
    printf(" Название книги: Автор книги: Год издания книги:\n");
    printf("-----------------------------------------------------------\n");
    
    while (fread(&book, sizeof(book), 1, fp))
    {
        if (strcmp(book.language,name)==0)
        {
            printf(" %7s %16s %16d \n\n", book.name, book.author, book.year, book.language);
            k++;
        }
    }
    if (k==0) printf("Книга(и) по языку программирования '%s' - не найдена(ы).\n\n", name);
    
    fclose(fp);
}

void del(FILE *fp)
{
    int nol=0, i=1;
    char name[50], k=0,lol;
    
    system("cls");
    fp=fopen("database.dat","rb+");
    printf("Введите название книги: ");
    scanf("%s",&name);
    
    while(fread(&book, sizeof(book), 1, fp))
    {
        if (strcmp(book.name,name)==0)
        {
            fseek(fp,-sizeof(book),SEEK_CUR);
            fwrite(&nol,1,sizeof(book),fp);
            printf("Книга '%s' - удалена.\n\n", name);
            fclose(fp);
            k++;
            break;
        }
    }
    if (k==0) printf("Книга '%s' - не найдена.\n\n", name);
}

Ответы (1 шт):

Автор решения: AlexGlebe

В функции del вы пытаетесь стереть в файле данные, но затираете их мусором стека. Так как &nol - это адрес переменной в стеке.

int nol = 0 ;
fseek(fp,-sizeof(book),SEEK_CUR);
fwrite(&nol,1,sizeof(book),fp);

Стирать данные в файле таким способом не получиться, так как они храняться на физическом носителе и нужно все переносить. Считать всё и записать по-новой все данные без данной записи.

Сначала переименовать надо файл базы :

#include <stdio.h>
int rename(const char *oldpath, const char *newpath);

oldpath - полный путь и имя базы данных. C:\\......database.dat.

newpath - полный путь и имя базы данных. C:\\......database-backup.dat.

Затем открыть database-backup.dat для чтения и записывать структуры без той, что хотите удалить в database.dat.

→ Ссылка