wozsun 2021-11-23 16:05 采纳率: 100%
浏览 43
已结题

用vector存放class类型数据,在文件读取时应该是发生了死循环。导致程序一直运行不出来。

main函数中会首先创建一个类对象,在运行代码时,先执行构造函数,读文件操作在构造函数里。运行时就弹出黑窗,然后内存一直增加。
将文件相关的代码注释掉,程序正常运行。不知道读文件代码哪里出了问题
构造函数的读文件代码如下:

BookManage::BookManage()
{
    ifstream ifs;
    ifs.open(FileName, ios::in);
    
    //文件不存在
    if (!ifs.is_open())
    {
        Book_Num = 0;            //初始化书籍种类数量为0
        ifs.close();
        return;            //如果文件不存在直接退出,
    }
    
    //文件数据为空
    char a;
    ifs >> a;
    if (ifs.eof())
    {
        Book_Num = 0;
        ifs.close();
        return;
    }
    
    //文件存在且数据不为空
    Book_Num = get_bookNum();        //更新书籍种类数量
    string name;
    string isbn;
    string number;
    string writer;
    string press;
    string publish_time;
    int publish_number;
    double price;
    int amount;
    for(int i=0;i<Book_Num;i++)
    {
        ifs >> name  >> isbn  >> number  >> writer >> press  >> publish_time  >> publish_number >> price >> amount;
        BookManage b;
        b.Name = name;
        b.ISBN = isbn;
        b.Number = number;
        b.Writer = writer;
        b.Press = press;
        b.Publish_Time = publish_time;
        b.Publish_Number = publish_number;
        b.Price = price;
        b.Amount = amount;
        book.push_back(b);
    }
    ifs.close();
}

文件中的数据:

img

运行时:

img

展开全部

  • 写回答

1条回答 默认 最新

  • 关注

    在for循环中,判断是否读取失败
    if(ifs.fail()) break;
    另外,你读取数据的时候,每一行最后的换行符也需要用一个char来读取一下,否则会影响后面数据的读取。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    wozsun 2021-11-24 03:25

    
        //文件存在且数据不为空
        Book_Num = get_bookNum();        //更新书籍种类数量
        string name;
        string isbn;
        string number;
        string writer;
        string press;
        string publish_time;
        int publish_number;
        double price;
        int amount;
        for(int i=0;i<Book_Num;i++)
        {
            if (ifs.fail())
                break;
            char w;
            ifs >> name >> isbn >> number >> writer >> press >> publish_time >> publish_number >> price >> amount >> w;
            BookManage b;
            b.Name = name;
            b.ISBN = isbn;
            b.Number = number;
            b.Writer = writer;
            b.Press = press;
            b.Publish_Time = publish_time;
            b.Publish_Number = publish_number;
            b.Price = price;
            b.Amount = amount;
            book.push_back(b);
        }
        ifs.close();
    }
    

    改成这样后还是一样的,运行不出来

    回复
    技术专家团-小桥流水 回复 wozsun 2021-11-24 03:31

    FileName这个变量在哪里赋的值?是什么类型?

    回复
    技术专家团-小桥流水 回复 wozsun 2021-11-24 03:34

    我晕哦。。。。。你在BookManage的构造函数中声明BookManage b;这样导致死循环了,不能这么用啊
    你重新定义一个结构体,把哪些字段放在结构体中,在BookManage中定义一个数组,来管理这些数据就可以了

    回复
    展开全部13条评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 12月1日
  • 已采纳回答 11月24日
  • 创建了问题 11月23日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部