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的回答:需要修改的部分:
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
,以避免重复读取最后一行数据。list()
函数中,修改输出格式控制符,例如将%-d
改为%d
、%-10s
改为%s
、%-2f
改为%.2f
。list()
函数。修改原因:
list()
函数,以正确显示图书信息。请根据上述修改建议修改代码并进行测试。如果还有其他问题,请随时提问。
不知道你这个问题是否已经解决, 如果还没有解决的话:/* 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中的弱符号,选择最靠近前的弱符号,即编译命令中写在最前面的(从左到右)。
问题出在读取文件内容的部分。代码只读取了文件中的第一个字符,然后就结束了,没有读取完整个文件的内容。
要解决这个问题,可以使用循环来读取文件内容,直到文件结束为止。具体步骤如下:
下面是修改后的代码示例:
#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;
}
这样修改之后,运行程序选择浏览图书信息的功能,就能够正确读取并处理文件中的内容了。