c语言图书管理系统文件相关

c语言图书管理系统中当data文件中有内容时选择浏览图书信息,却会打印出系统中没有数据!应该与前面的in out 函数有关。
下面是相关代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
int num=0;
int vis[100];
FILE *fp;//指针 
struct info  //图书信息结构体

{int bianhao;
 char name[20];
 float price;
 char chubanshe[20];
 char date[20];
 int kucun;
}em[100];


void in() {
    if ((fp = fopen("data.txt", "r")) == NULL) {
        printf("Error: cannot open data file.\n");
        return;
    }
    while (!feof(fp)) {
        num++;
        fscanf(fp, "%d%s%f%s%s%d", &em[num].bianhao, em[num].name, &em[num].price, em[num].chubanshe, em[num].date, &em[num].kucun);
        vis[num] = 1;
    }
    fclose(fp);
}


void out(){//保存数据到文件中 
    int i;
    if((fp=fopen("data.txt","w")) == NULL)//以写模式打开"data.text"文件 
        return;
    for(i=1;i<=100;i++)
        if(vis[i]==1)    
            fprintf(fp,"%-d   %-10s    %-2f    %-10s   %-10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun); //存入信息 
    fclose(fp);//关闭文件


} 
void memu1() //中文菜单
{
  printf("              ############欢迎进入员工工信息管理系统##########\n"); 
  printf("                         1.录入图书信息   4.查询图书信息\n");  
  printf("                         2.修改图书信息   5.浏览图书信息\n");
  printf("                         3.删除图书信息   6.清屏\n"); 
  printf("                         0.退出\n"); 
  printf("              ##############################################\n");
}


void memu2() //英文菜单

{

printf("              ############welcome to system##########\n"); 

printf("                         1.add      4.serch\n");  

printf("                         2.modify   5.list\n");

printf("                         3.del      6.cls\n"); 

printf("                         0.quit\n"); 

printf("              ##############################################\n");

}

void add()

{
    int n, i, flag = 1;
    printf("请输入图书编号:");



    while (flag == 1)

    {
        scanf("%d", &n);
        for (i = 1; i <= num; i++) // 遍历已添加的图书
        {

            if (em[i].bianhao == n)

            {
               printf("图书编号已存在,请重新输入:");
                break;
            }

        }

        if (i > num)

            flag = 0;

    }

    num++;

    em[num].bianhao = n;

    printf("请输入图书名字:");
    scanf("%s", &em[num].name);
    printf("请输入图书价格:");
    scanf("%f", &em[num].price);
    printf("请输入图书出版社:");
    scanf("%s", &em[num].chubanshe);
    printf("请输入图书出版日期:");
    scanf("%s", &em[num].date);
    printf("请输入图书库存:");
    scanf("%d", &em[num].kucun);

    vis[num]=1; 
    out(); 
}





void modify()

{

int n,i,t;

printf("请输入需要修改的图书编号:");

    scanf("%d",&n);

   for(i=1;i<=100;i++)   //查询该员工是否存在

 if(em[i].bianhao==n && vis[i]==1)

     break;



 

if (i<=100)



{printf("以下显示的该图书的现有信息:\n");

 printf("编号      书名     价格       出版社         出版日期         库存\n");                                              

 printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);printf("需要修改哪个信息?1.书名 2.价格 3.出版社 4.出版社日期 5.库存 0.放弃修改\n");

 scanf("%d",&t);

 if (t==1)

 { printf("请输入修改后的图书书名:");

   scanf("%s",&em[i].name);

 }

 else if (t==2)

 { printf("请输入修改后的图书价格:");

   scanf("%f",&em[i].price);

 }



 else if (t==3)

 {  printf("请输入修改后的图书出版社:");

    scanf("%s",&em[i].chubanshe);

 }

 else if (t==4)

 { printf("请输入修改后的出版日期:");

   scanf("%s",&em[i].date);

 }

  else if (t==5)

 {  printf("请输入修改后的图书库存:");
    scanf("%d",&em[i].kucun);
 }
   else if (t==0)
  {
     system("cls");
  }
  printf("修改成功。");
}
else
  printf("没有该图书编号。");
out();//修改后的数据保存到文件中

}







void del()

{ int n,i;

printf("请输入你要删除的图书编号:");

scanf("%d",&n);

 for(i=1;i<=100;i++)   //查询该图书是否存在

   if(em[i].bianhao==n && vis[i]==1)

     break;

  if (i>num)

    printf("未找到该图书编号\n");

  else

  { vis[i]=0; //添加删除的标记。1:表示有效数据  0:空数据或者删除的数据

    printf("记录删除成功\n");

  }



}



void bynumber() //用于serch 

{

int n,i;

printf("请输入查询的图书编号:");

    scanf("%d",&n);

   for(i=1;i<=100;i++)   //查询该图书是否存在

 if(em[i].bianhao==n && vis[i]==1)

     break;



 

if (i<=100)



{printf("以下显示的该图书的现有信息:\n");

 printf("编号      书名     价格       出版社         出版日期         库存\n");                                              

 printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);

}

else

printf("未找到该图书\n") ; 

}



void byname()

 {char ch[20],i,count=0;

 printf("请输入要查询的图书书名:");

 scanf("%s",ch);

 for(i=1;i<=100;i++)

   if(strcmp(ch,em[i].name)==0 && vis[i]==1)

   {     count++;

        if (count==1)

          printf("编号      书名     价格       出版社         出版日期         库存\n");

 printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);

   }

 

 if (count==0)

   printf("没有该图书。\n");

 }



void bychubanshe()

 {char ch[20],i,count=0;

 printf("请输入要查询的图书出版社:");

 scanf("%s",ch);

 for(i=1;i<=100;i++)

   if(strcmp(ch,em[i].chubanshe)==0 && vis[i]==1)

   {     count++;

        if (count==1)

          printf("编号      书名     价格       出版社         出版日期         库存\n");                                              

 printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);

   }

 

 if (count==0)

   printf("没有该图书。\n");

 }

 


 void bydate()

  {char ch[20],i,count=0;

  printf("请输入要查询的图书出版社:");

  scanf("%s",ch);

  for(i=1;i<=100;i++)

    if(strcmp(ch,em[i].date)==0 && vis[i]==1)

    {     count++;

         if (count==1)

           printf("编号      书名     价格       出版社         出版日期         库存\n");                                              

   printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);

    }

  

  if (count==0)

    printf("没有该图书。\n");

  }



void bykucun() //用于serch 

{

int n,i;

printf("请输入查询的图书库存:");

    scanf("%d",&n);

   for(i=1;i<=100;i++)   //查询该图书是否存在

 if(em[i].bianhao==n && vis[i]==1)

     break;



 

if (i<=100)



{printf("以下显示的该图书的现有信息:\n");

 printf("编号      书名     价格       出版社         出版日期         库存\n");                                              

 printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);

}

else

printf("未找到该图书\n") ; 

}



void byprice(){
    char c;
    int i,n,count=0;
    getchar();//读取"\n" 
    printf("请输入要查询的员工的工资区间:");
    scanf("%c %d",&c,&n);
    if (c=='>')
     
        for(i=1;i<=100;i++)
            if(em[i].price>n){
                count++;
                if(count==1)
                printf("编号      书名     价格       出版社         出版日期         库存\n");                                              
                
                printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);
                 
            } 
    
    if (c=='=')
    
        for(i=1;i<=100;i++)
            if(em[i].price==n){ 
                count++;
                if(count==1)
                printf("编号      书名     价格       出版社         出版日期         库存\n");                                              

                printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);
            }    
                    
    if (c=='<')
     for(i=1;i<=100;i++)
       if(em[i].price<n){ 
          count++;
          if(count==1)
                printf("编号      书名     价格       出版社         出版日期         库存\n");                                              
                 printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);
        }    
            
    
}


void serch()

{int t;

system("cls");

printf("                 ###########请选择查询方式##########\n"); 

printf("                     1.通过图书编号    5.通过库存 \n");  

printf("                     2.通过书名        6.通过出版日期   \n");

printf("                     3.通过价格区间    7.清屏 \n"); 

printf("                     4.通过出版社      0.退出\n"); 

printf("             ##############################################\n");



while(1)

{

printf("请输入您的选择:");

scanf("%d",&t);

if (t==1)
bynumber();
if (t==2)
byname();
if (t==3)
byprice();
if (t==4)
bychubanshe();
if (t==5)
bykucun();
if (t==6)
bydate();
if (t==7)
system("cls");
if (t==0)
memu1();
}
}





void list(){
    int n,i,t=0,count=0;
    printf("请输入每页显示的记录数量");
    scanf("%d",&n);
    system("cls");//清屏 
    for(i=1;i<100;i++)
        if(vis[i]==1){//判断数据有效 
            if(t==0){
              system("cls");
              printf("编号      书名     价格       出版社         出版日期         库存\n");
            }
            printf("%d   %10s    %2f    %10s   %10s   %d\n",em[i].bianhao,em[i].name,em[i].price,em[i].chubanshe,em[i].date,em[i].kucun);
            count++;
            if(t<n)//t用来判断每页显示数量是否已达到n 
                t++;
            if(t==n){ 
               t=0;
               system("pause");//暂停一下 
            }  
        } 
    if(count==0)
        printf("系统中没有数据!\n");    
}
int main()
{
 int n,m;
  printf("请选择菜单样式:1.中文  2.英文\n");
  scanf("%d",&m);
  memset(vis,0,sizeof(vis)); //将数据有效状态初始设置为0
  system("cls");  //清屏
 while(1)
 {
if (m==1)
        memu1();
else
    memu2();  
 printf("请输入你的选择:");
 scanf("%d",&n);
     if (n==1)  //添加员工信息
        add();
    if (n==2)  //修改员工信息
        modify();
    if (n==3)  //删除员工信息
        del();
    if (n==4)
     serch();
    if (n==5)
     list();
 }
return 0;
} 

以下引用了GPT的回答:需要修改的部分:

  1. in()函数中,修改文件读取部分的循环条件为num < 100 && fscanf(fp, "%d%s%f%s%s%d", &em[num].bianhao, em[num].name, &em[num].price, em[num].chubanshe, em[num].date, &em[num].kucun) == 6,以避免重复读取最后一行数据。
  2. list()函数中,修改输出格式控制符,例如将%-d改为%d%-10s改为%s%-2f改为%.2f
  3. 在菜单函数中,将选项5的函数调用改为list()函数。

修改原因:

  1. 解决了文件读取的问题,避免重复读取最后一行数据。
  2. 修正了输出格式控制符,确保数据以正确的格式显示。
  3. 将选项5的函数调用改为list()函数,以正确显示图书信息。

请根据上述修改建议修改代码并进行测试。如果还有其他问题,请随时提问。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: 【C语言】强符号与弱符号中的 3.2.3.1、弱符号全部在.data中 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    /* main.c 文件 */
    #include <stdio.h>
    
    extern int a;
    
    int main(int argc, const char *argv[])
    {
    	printf("a = %d\n", a);	
    }
    
    /* weak1.c 文件 */
    int __attribute__((weak)) a = 20;
    
    /* weak2.c 文件 */
    int __attribute__((weak)) a = 30;
    

    编译与运行结果:
    在这里插入图片描述

    结论: 多个在.data中的弱符号,选择最靠近前的弱符号,即编译命令中写在最前面的(从左到右)。

  • 以下回答来自chatgpt:

    问题出在读取文件内容的部分。代码只读取了文件中的第一个字符,然后就结束了,没有读取完整个文件的内容。

    要解决这个问题,可以使用循环来读取文件内容,直到文件结束为止。具体步骤如下:

    1. 修改代码中读取文件内容的部分,使用一个循环来读取每个字符,直到文件结束为止。
    2. 在循环中,将读取到的字符打印出来或者存储到变量中,以便后续处理。
    3. 关闭文件。

    下面是修改后的代码示例:

    #include<stdio.h>
    #include<stdlib.h>
    
    // 定义图书结构体
    struct Book {
        char name[50];
        char author[50];
    };
    
    int main() {
        // 打开data文件
        FILE *file = fopen("data.txt", "r");
    
        // 判断文件是否存在
        if (file == NULL) {
            printf("系统中没有数据!\n");
            return 0;
        }
    
        // 读取文件内容
        char ch;
        while ((ch = fgetc(file)) != EOF) {
            // 处理读取到的字符,比如打印出来或者存储到变量中
            printf("%c", ch);
        }
    
        // 关闭文件
        fclose(file);
    
        // 读取图书信息
        // ...
    
        return 0;
    }
    

    这样修改之后,运行程序选择浏览图书信息的功能,就能够正确读取并处理文件中的内容了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^