为什么fgets不起作用?

一个简单图书管理系统两个函数,单独使用都没有问题,但是当调用完第一个函数之后再调用第二个,中间的while (fgets(buf2, 1000, fp2))就直接跳过了,也不知道是什么问题
/*-----------新增图书函数------------*/
void add()
{
FILE *fp;
int i,confirm,n;
printf("\t\t|------------------新增图书书目---------------------|\n");
printf("要新增书的数量(不超过100):");
scanf("%d",&numb);
for(i=num;i<numb+num;i++)
{
printf("\t\t请输入序号:");
scanf("%d",&b[i].ID);
printf("\n");

    printf("\t\t请输入书名:");
    scanf("%s",b[i].bookname);
    printf("\n");

    printf("\t\t请输入作者名:");
    scanf("%s",b[i].writer);
    printf("\n");

    printf("\t\t请输入出版社:");
    scanf("%s",b[i].company);
    printf("\n");

    printf("\t\t请输入年份:");
    scanf("%d",&b[i].year);
    printf("\n");

    printf("\t\t请输入月份:");
    scanf("%d",&b[i].month);
    printf("\n");

    printf("\t\t请输入价格:");
    scanf("%d",&b[i].price);
    printf("\n");       
}
printf("输入完成是否保存?保存请输入1,不保存请输入0:");
scanf("%d",&confirm);
if(confirm==1)
{
    saveall();
}
    return ;

}
/*----------------------输出所有书目信息-------------------*/
void printall()
{
int number=0,i=0;
FILE *fp2;
bookinf c[10000];
char buf2[1000];
fp2 = fopen("D:\book.txt", "r"); // 打开文件
if (!fp2) // 判断是否打开成功
{
perror("读取文件失败");
return 0;
}
while (fgets(buf2, 1000, fp2))
number+=1; // 累计行数
fclose(fp2);
fp2= fopen("D:\book.txt", "r"); // 打开文件
if(fp2==NULL)
{
perror("读取文件失败");
return 0;
}
memset(c,0X0,sizeof(c));
while (fp2)
{
fscanf(fp2,"%d%s%s%s%d%d%d",&c[i].ID,c[i].bookname,c[i].writer,c[i].company,&c[i].year,&c[i].month,&c[i].price);
if(ferror(fp2))
{
fclose(fp2);
perror("读文件失败");
}
if(i==number)
{
break;
}
i++;
}
fclose(fp2);
for(i=0;i<number;i++)
{
printf("序号:%d,书名:%s,作者:%s,出版社:%s,日期:%d年%d日,价格:%d元\n",c[i].ID,c[i].bookname,c[i].writer,c[i].company,c[i].year,c[i].month,c[i].price);
}
}

4个回答

while没执行 就是你进循环的条件是false而不是true

CLKAB
CLKAB 而且什么原因会导致false啊。。
大约 4 年之前 回复
CLKAB
CLKAB 可直接使用的时候是可以进去的啊,为什么执行完第一个函数后再执行它就进不去了?
大约 4 年之前 回复

fp2 = fopen("D:\book.txt", "r"); // 打开文件路径名要用两个反斜杠
fp2 = fopen("D:'\book.txt", "r"); //像这样

CLKAB
CLKAB 我是用的两个反斜杠,不知道为什么复制过来就变成单斜杠了
大约 4 年之前 回复

那么很有可能是你的数据还没写入你的book.txt文件里(也可能还在缓冲区里)。
你写文件的操作是在saveall这个函数里的吗?
建议你贴完整代码,这样可以帮你调试看看

确定saveall函数功能正确吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐