#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();}
c语言图书馆管理系统中的加入书籍模块,单独测试正常但放入主函数中引用无法进行输入
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 芣苢的成长之路 2023-06-27 00:43关注
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; }
解决 无用评论 打赏 举报
悬赏问题
- ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
- ¥88 找成都本地经验丰富懂小程序开发的技术大咖
- ¥15 如何处理复杂数据表格的除法运算
- ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
- ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
- ¥200 uniapp长期运行卡死问题解决
- ¥15 latex怎么处理论文引理引用参考文献
- ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
- ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
- ¥15 乘性高斯噪声在深度学习网络中的应用