Структурка. Как убрть пустую строку. Помогите пофиксить
Есть код: Нужно подкоректировать его так что бы строка полностью была чиста без символов или букв. И если реально возможно то удалить её просто(пустую строку). Посмотрите скрин, как убрать оттуда число что это вообще как оно там появилось
#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 шт):
В функции 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.