#include<stdio.h>
void backfunc(void);
void addbook(void);
void removebook(void);
void searchbook(void);
void listbook();
char str[20];
int a,c,d;
char b;
FILE *fptr;
char b;
struct library{
int a,c,d;
char b;
};
int main(){
system("cls");
int s;
printf(" library management system menu \n");
puts("1.add book");
puts("2.remove book");
puts("3.search book");
puts("4.display all the books");
printf("choose a number:");
scanf("%d",&s);
switch(s){
case 1:
addbook();break;
case 2:
removebook();break;
case 3:
searchbook();break;
case 4:
listbook();break;
default:
system("cls");
printf("type number please.");
backfunc();break;
}
}
void backfunc(void){
printf("\n press enter back to menu");
b:
if(getch()==13)
main();
else
goto b;
}
void addbook(void){
system("cls");
FILE *fptr;
fptr=fopen("D://newfile.txt","a+");
char str[20];
printf("add a book id and the name:");
fgets(str, 19, stdin);
fputs(str, fptr);
backfunc();
}
removebook(){
int c;
FILE *frea ,*fwri;
frea=fopen("D://newfile.txt","r");
fwri=fopen("D://newfile2.txt","w");
system("cls");
printf("\nenter the book num that you want to remove");
scanf("%d",&c);
if(frea==NULL||fwri==NULL){
printf("something is wrong");
}while(fgets(str,20,frea))
if(str[0]!=c)
fputs(str,fwri);
fclose(frea);
fclose(fwri);
remove("newfile.txt");
rename("newfile2.txt","newfile.txt");
printf("\n now it is removed");
backfunc();}
void searchbook(void){
system("cls");
printf("\ntype the numb of the book");
int i;
FILE *fp1;
int CurrentIndex=0;
char StrLine[1000];
printf("type the book id ");
scanf("%d",&i);
if((fp1 = fopen("D://newfile.txt","r")) == NULL)
{
printf("error!");
return NULL;
}
while (!feof(fp1))
{
if (CurrentIndex==i)
{
fgets(StrLine,1000,fp1);
printf("%s", StrLine);
return StrLine;
}
fgets(StrLine,1000,fp1);
CurrentIndex++;
}
fclose(fp1);
backfunc();}//why this back is useless?
void listbook(){
system("cls");
FILE *fptr;
char c;
fptr=fopen("D://newfile.txt","r");
while(1)
{
c=fgetc(fptr);
if(c==EOF)
break;
else printf("%c",c);
}
fclose(fptr);
backfunc();}
1、在addbook函数中,你在函数开始处定义了一个名为fptr的文件指针,然后在函数的开头又重新定义了一个同名的文件指针。这会导致在函数的其余部分无法访问到前面定义的文件指针。为了解决这个问题,你可以删除函数开头的FILE *fptr;定义,并将文件指针作为参数传递给函数,或者将文件指针定义为全局变量,以便在整个程序中都可以访问到它。
2、在removebook函数中,你打开了两个文件指针:frea和fwri。但是,在循环中你只读取了一个文件指针,并将其内容写入另一个文件指针。然后你关闭了两个文件指针,但是没有关闭打开的fptr文件指针。此外,在删除文件后使用rename函数时,应该使用完整的文件路径,而不仅仅是文件名。
void removebook(){
int c;
FILE *frea, *fwri;
frea = fopen("D://newfile.txt", "r");
fwri = fopen("D://newfile2.txt", "w");
system("cls");
printf("\nenter the book num that you want to remove: ");
scanf("%d", &c);
if (frea == NULL || fwri == NULL){
printf("something is wrong");
return;
}
while (fgets(str, 20, frea)){
if (str[0] != c)
fputs(str, fwri);
}
fclose(frea);
fclose(fwri);
remove("D://newfile.txt");
rename("D://newfile2.txt", "D://newfile.txt");
printf("\n now it is removed");
backfunc();
}
在searchbook函数中,你定义了一个名为StrLine的字符数组,用于存储从文件中读取的内容。然后你尝试返回该数组,但是函数声明是void类型,因此不能返回任何值。如果你想要返回StrLine数组,函数声明应该是char*类型。另外,backfunc()函数调用应该在函数的最后,而不是在最后的fclose语句之后。
char* searchbook(void){
system("cls");
printf("\ntype the numb of the book: ");
int i;
FILE *fp1;
int CurrentIndex=0;
static char StrLine[1000];
printf("type the book id: ");
scanf("%d", &i);
if((fp1 = fopen("D://newfile.txt", "r")) == NULL){
printf("error!");
return NULL;
}
while (!feof(fp1)){
if (CurrentIndex == i){
fgets(StrLine, 1000, fp1);
printf("%s", StrLine);
fclose(fp1);
backfunc();
return StrLine;
}
fgets(StrLine, 1000, fp1);
CurrentIndex++;
}
fclose(fp1);
backfunc();
return NULL;
}