回 帖 发 新 帖 刷新版面

主题:文件数据载入链表,出现了问题!求救

#include<stdio.h>
#include<malloc.h>
struct book//图书信息
{
    int b_no;
    char b_name[20];
    char press[20];//出版社
    float price;//单价
    char borrow;//是否借出
    int borrow_no;//借书人编号
    struct book *next;
};

struct book *in_book()//载入图书信息
{    
    char s[1000];
    struct book *p,*last,*head;
    p=(struct book*) malloc(sizeof(struct book));
    FILE *fp;
    if((fp=fopen("D://book.txt","r"))!=NULL)
    {
        
        fgets(s,1000,fp);            //吸收文件第一行表头
        
        if(!feof(fp))
        {
            fscanf(fp,"%d%s%s%f%c",&p->b_no,p->b_name,p->press,&p->price,&p->borrow);
            p->next=NULL;
            last=p;
            head=p;
        
    
            while(!feof( fp ))
            {
                p=(struct book*) malloc(sizeof(struct book));
                fscanf(fp,"%d%s%s%f%c",&p->b_no,p->b_name,p->press,&p->price,&p->borrow);
                p->next=NULL;
                last->next=p;
                last=p;
            }
        }
        printf("载入图书信息成功\n");
        return head;
    }
    else
        printf("载入图书信息失败\n");
    fclose(fp);
}
main()
{
    struct book *p;
    p=in_book();
}
文件没有语法错误,但运行起来错了!!!

求指教!!

我急用啊!![em10]

book.txt中的东西是:
图书编号      书名             出版社    单价    是否借出   
12345678   C语言程序设计      清华大学    38.00      y
12345679   四级词汇           兴界国      25.00      n
12345680   微积分             高等教育    20.00      n
12345681   杜拉拉升职记       中国科技大  20.00      n




问题貌似处在fscanf(fp,"%d%s%s%f%c",&p->b_no,p->b_name,p->press,&p->price,&p->borrow);

中不能用%f,把%f改了就可以了,但我还是要用%f啊!!!

谁来救救我。

回复列表 (共5个回复)

沙发

我想楼主对fscanf这个函数不是很熟悉吧,我觉得您的代码的问题就出在这个函数里。
这个函数对于%d %f %s等格式会对空白和换行进行截断,但%c可不会,您想想,空白或换行都是有字符和它们对应的。
fscanf(fp,"%d%s%s%f%c",&p->b_no,p->b_name,p->press,&p->price,&p->borrow);
您这句话,到%c后只接受了一个空格(p->borrow等于32),然后那一行还没有读完,然后就进入下一个循环来读取。
然后到要%d的时候,就相当于输入的只是"y\n",也就是说它一直在缓冲区读取数据,但是又没有合理数据可用,而缓冲区又确实有数据,所以暂时不接受后面的输入,故这里会出现死循环。
把这句改为这样是可以的:
[code=c]fscanf(fp,"%d%s%s%f %c",&p->b_no,p->b_name,p->press,&p->price,&p->borrow);
[/code]
这样在%c前面加一个空格就会跳过y或n前面的空格,这样p->borrow才能接正确收得到字符。  

板凳


没用啊,问题是出在%f啊!

3 楼

您再仔细看看,安我说的那样去改,看是不是问题能解决呢?
我觉得%f没有错误

4 楼

我这里测试正确,并测试了下从文件输入得到的各个数据也是正确的。
您的代码中有2处
[code=c]fscanf(fp,"%d%s%s%f%c",&p->b_no,p->b_name,p->press,&p->price,&p->borrow);[/code]
那两个地方您都改了么?

5 楼

寻找中国的最优秀的网商领袖精英  
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846 
占领市场第一先机,合力打造网商系统!
淘宝商盟官网   www.taobaosm.com
 http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度

我来回复

您尚未登录,请登录后再回复。点此登录或注册