qq2874015291 2021-01-17 15:29 采纳率: 0%
浏览 10

c语言图书馆管理系统中的加入书籍模块,单独测试正常但放入主函数中引用无法进行输入

#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条回答 默认 最新

  • 芣苢的成长之路 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 乘性高斯噪声在深度学习网络中的应用