| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1049 人关注过本帖
标题:这段代码为什么崩溃?
取消只看楼主 加入收藏
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:7 
这段代码为什么崩溃?
lrecord是list容器,元素为含有整型、浮点、string的结构。要求是从一个文件里读取数据。确保文件打开正确,但是在读取第一条之后,往lrecord里添加新元素时就崩溃了
程序代码:
while(!feof(fin))
        {
            lrecord.push_back(nrecord);
            fread(&nrecord,sizeof(record),1,fin);
        }

 
搜索更多相关主题的帖子: fin 数据 元素 
2012-02-28 22:26
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
会不会是因为那个结构没有定义复制函数?

酱油实习生
2012-02-28 22:28
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 3楼 辰星睿
请详细说一下?启用cppcheck之后发现定义这个结构的地方有警告,warning: 'rr::id' should be initialized in the member initialization list,会不会跟这有关?但是搜不到解决办法,怎么消掉?

酱油实习生
2012-02-28 23:17
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 5楼 辰星睿
怎么初始化啊?以前经常这样用,好像都没问题

酱油实习生
2012-02-29 12:07
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
程序代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <list>
using namespace std;
typedef struct rr
{
    int id,num;
    double price;
    string name;
}record;
int main()
{
    record nrecord;
    list<record> lrecord;
    list<record>::iterator rite;
    int total=-1;
    FILE *fin,*fout;
    char look;
    cout<<"请输入要处理的商品数量,100以内,0表示建立新文件:";
    cin>>total;
    while(total<0||total>100)
        cout<<"输出有误,请重新输入:";
    if(total==0)
    {
        fout=fopen("commodity.dat","wb");
    }
    else
    {
        if(!(fin=fopen("commodity.dat","rb")))
        {
            cout<<"对不起,文件不存在。";
            return 0;
        }
        fread(&nrecord,sizeof(record),1,fin);
        while(!feof(fin))
        {
            lrecord.push_back(nrecord);
            fread(&nrecord,sizeof(record),1,fin);
        }
        fclose(fin);
        cout<<"是否查看原来的记录?y/n";
        cin>>look;
        if(look=='y'||look=='Y')
        {
            rite=lrecord.begin();
            if(rite==lrecord.end())
                cout<<"无记录。"<<endl;
            else
                for(;rite!=lrecord.end();++rite)
                {
                    cout<<"ID"<<rite->id<<" 名称"<<rite->name<<" 数量"<<rite->num<<" 价格"<<rite->price<<endl;
                }
        }
        fout=fopen("commodity.dat","wb");
        while(total--)
        {
            cout<<"请输入商品名称:";
            cin>>nrecord.name;
            cout<<"请输入另外三个数据:";
            cin>>nrecord.id>>nrecord.num>>nrecord.price;
            for(rite=lrecord.begin();rite!=lrecord.end()&&rite->id<nrecord.id;++rite);
            if(rite!=lrecord.end()&&rite->id==nrecord.id)
                *rite=nrecord;
            else    lrecord.insert(rite,nrecord);
        }
        for(rite=lrecord.begin();rite!=lrecord.end();++rite)
        {
            fwrite(&(*rite),sizeof(record),1,fout);
            cout<<"ID"<<rite->id<<" 名称"<<rite->name<<" 数量"<<rite->num<<" 价格"<<rite->price<<endl;
        }
        fclose(fout);
    }
    cout<<"文件已保存,谢谢使用。";
    return 0;
}

酱油实习生
2012-02-29 21:55
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 9楼 TonyDeng
感谢版主,解答真详细啊。那么用char[]的话可以吧?这样的结构可以直接用insert添加是吗?

酱油实习生
2012-03-01 12:53
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 11楼 TonyDeng
原来如此啊,还真不知道。以前没有用过string,因为最近才开始学C++…………那么warning: 'rr::id' should be initialized in the member initialization list怎么解决呢?这个id是int类型的,其他成员也有同样的警告

酱油实习生
2012-03-01 14:53
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
谢谢大家啦!~

酱油实习生
2012-03-02 22:42
快速回复:这段代码为什么崩溃?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024301 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved