| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1049 人关注过本帖
标题:这段代码为什么崩溃?
只看楼主 加入收藏
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:14 
这段代码为什么崩溃?
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: 2
等 级:论坛游民
威 望:3
帖 子:33
专家分:63
注 册:2010-12-24
收藏
得分:0 
或者考虑下内存问题?
2012-02-28 22:39
墨清扬
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: 2
等 级:论坛游民
威 望:3
帖 子:33
专家分:63
注 册:2010-12-24
收藏
得分:0 
回复 4楼 墨清扬
按提示理解 应该是说你的结构体没有被初始化 以致后面的数据没法使用 你可以试着在结构体这块上将其初始化看看效果
2012-02-29 10:35
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:0 
回复 5楼 辰星睿
怎么初始化啊?以前经常这样用,好像都没问题

酱油实习生
2012-02-29 12:07
辰星睿
Rank: 2
等 级:论坛游民
威 望:3
帖 子:33
专家分:63
注 册:2010-12-24
收藏
得分:0 
回复 6楼 墨清扬
这个我不知道怎么说 因为我不知道你的代码是怎样的 我都只是猜测的
2012-02-29 18:06
墨清扬
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
結構record不要用string,那是不定長的,每個sizeof()的尺寸不一樣。第一次讀文件時,nrecord是空殼,name="",但讀文件後是文件中第一個記錄的name長度,此時nrecord的尺寸改變,不過此尺寸未必正好是第二個記錄的記錄尺寸,後面就出錯了。如果讀寫文件,穩妥的辦法是record結構用固定長度的數組。注意:string是可變長度的容器,而你用了sizeof()求尺寸。

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

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



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

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