| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 541 人关注过本帖
标题:为什么下面这个程序的代码编译通过了,但程序运行时部分功能无法实现?求解 ...
只看楼主 加入收藏
洪喜泓
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-12-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
为什么下面这个程序的代码编译通过了,但程序运行时部分功能无法实现?求解!
#include<iostream>
#include<fstream>
using namespace std;
struct material//物资结构
{
    int number;//物资号
    char name[40];//物资名
    long balance;//库存量
};
void Initial(const char *fileDat );
void CreateTxt(const char* fileDat);
void Append(const char *fileDat);
void Inquire(const char*fileDat);
void Lingliao( const char *fileDat );
int endMark(material book);
//建立主菜单,选择操作
int main()
{
    char choice;
    while (1)
    {
        const char *fileDat = "d:\\materialsFile.dat";    //物资数据文件名
        cout<<"**********物资管理**********\n请输入操作选择\n"
                <<"1 :入库\t" <<"2 :领料\t" <<"3 :查询\t"
                <<"4 :建立文本\t" <<"0 :初始化\t" <<"Q :退出\n";
        cin>>choice;
        switch ( choice )
        {   
            case '1' : Append(fileDat);    break;
            case '2' : Lingliao(fileDat);        break;
            case '3' : Inquire(fileDat);    break;
            case '4' : CreateTxt(fileDat);    break;
            case '0' : Initial(fileDat);    break;
            case 'q':
            case 'Q': cout<<" 退出系统\n";    return 0;
            default : cout<<"输入错误,请再输入\n";
        }
    }
}
//初始化物资文件。建立只有一个标志记录的空文件
void Initial(const char *fileDat )
{  
    material mark;
    //以写方式打开,建立新文件
    fstream fdat(fileDat, ios::out|ios::binary);
    cout<<"若物资文件存在,将删除原有数据,要进行文件初始化吗?(Y/N)\n";
    char answer;
    cin>>answer;
    if( answer=='Y'||answer=='y')
    {
        fdat.seekp( 0, ios::beg );                                    //写指针移到文件头
        fdat.write((char*) &mark, sizeof(material));        //写入空标志
        cout<<"文件已经初始化。\n";
    }
    else
        cout<<"取消操作\n";
    fdat.close();                                //关闭文件
}
//读出已有二进制数据文件中的数据,写入文本文件中
//建立格式化的文本文件,便于浏览、打印
void CreateTxt(const char* fileDat)
{
    const char*fileTxt = "d:\\materialsFile.txt";   //文本文件名
    fstream fdat(fileDat, ios::in|ios::binary);    //以读方式打开二进制数据文件
    fstream ftxt(fileTxt , ios::out);            //以写方式打开数据文本文件
    fdat.seekp( 0, ios::beg);                //二进制数据文件读指针移到文件头
    material m;
    cout<<"**********建立文本文件**********\n";
    do
    {
        fdat.read((char*)&m,sizeof(material));        //从二进制数据文件读记录
        if( !endMark(m) )                     //把记录写入文本文件
            ftxt<<m.number<<'\t'<<m.name<<'\t'<<m.balance<<'\n';
    } while( !endMark(m) );
    ftxt.close();                                //关闭文本文件
    cout<<"文本文件已建立,要浏览文件吗?( Y/N ) \n";
    char answer , s[80];
    cin>>answer;
    if( answer=='Y' || answer=='y' )
    {
        ftxt.open( "d:\\materialsFile.txt", ios::in);            //重用流打开文件
        while( !ftxt.eof() )                        //按行显示文本文件
        {
            ftxt.getline( s, 80 );
            cout<<s<<endl;   
        }
        ftxt.close();        //关闭文本文件
    }
    fdat.close();            //关闭二进制数据文件
}
//入库操作。如果是新物资,则在文件末尾追加一条记录;如果是已有物资,则增加库存量
void Append(const char *fileDat)
{
    char choice;
    material m,mark;
    int key;
    long num;
    fstream fdat(fileDat, ios::in|ios::out|ios::binary);   
    //以读/写方式打开文件
    if( !fdat )        //文件不存在
    {
        cout<<"物资文件不存在,请进行初始化操作。\n";
        return;
    }
    cout<<"**********入库登记**********\n";
    while (1)
    {  
        cout<<"请输入操作选择\n"
                <<"1:新物资号\t"<<"2:旧物资号\t" <<"Q:退出\n";
        cin>>choice;
        switch( choice )
        {
            case '1':                    //追加新记录
            {
                fdat.seekg(0,ios::beg);        //读指针移到文件头
                do                    //查找文件尾
                {  //读一个记录
                    fdat.read((char*)&m, sizeof(material));
                } while(!endMark(m));        //判断是否结束标志
                //置写指针位置
                fdat.seekp(-long(sizeof(material)), ios::cur);   
                cout<<"物资号(number) , 物资名(name), 数量(balance):\n ? ";    //输入新记录信息
                cin>>m.number;
                cout<<" ? ";
                cin>>m.name;
                cout<<" ? ";
                cin>>m.balance;
                fdat.write((char*)&m,sizeof(material));     //写记录
                fdat.write((char*)&mark,sizeof(material));     //写文件结束标志
                break;
            };
            case '2':                                        //修改已有记录库存量
            {  
                fdat.seekg( 0, ios::beg );            //文件读指针移到开始位置
                cout<<"物资号(number) :\n? ";
                cin>>key;                                //输入物资号
                do                                         //按物资号查找
                {  //读一个记录
                    fdat.read((char*)&m, sizeof(material));
                }while(m.number!=key &&!endMark(m));         //判断是否找到记录
                if( m.number == key )        //找到记录
                {
                    cout<< m.number<<'\t'<<m.name<<'\t'
                            <<m.balance<< endl;
                    cout<<"入库数量:\n? ";
                    cin>>num;
                    if( num>0 )
                        m.balance += num;        //修改库存量
                    else
                    {
                        cout<<"数量输入错误\n";
                        continue;
                    }
                    //置写指针位置
                    fdat.seekp(-long(sizeof(material)),ios::cur);
                    //写修改后记录
                    fdat.write((char*)&m,sizeof(material));
                    cout<<"现库存量:\t\t"<<m.balance<<endl;
                }
                else                 //找不到记录
                    cout<<"物资号输入错误\n";
                break;
            }
            case 'Q' :
            case 'q' :    return;        //退出入库登记,返回主菜单
        }
    }
    fdat.close();                        //关闭文件
}
//查询
void Inquire(const char*fileDat)
{
    char choice;
    material m;
    int key;
    fstream fdat(fileDat, ios::in|ios::binary);    //以读方式打开文件
    cout<<"**********查询**********\n";
    while (1)
    {
        cout<<"请输入操作选择\n"
                <<"1:按物资号查询\t"<<"2:浏览\t"<<"Q:退出\n";
        cin>>choice;
        switch( choice )
        {  
            case '1':                    //按物资号检索
            {
                fdat.seekg( 0, ios::beg );    //读指针从文件头开始检索
                cout<<"物资号(number):\n? ";
                cin>>key;
                do
                { //读一个记录
                    fdat.read((char*)&m,sizeof(material));
                }while(m.number!=key&&!endMark(m));  //判断是否找到
                if ( m.number == key )                    //找到记录
                    cout<<m.number<<'\t'<<m.name<<'\t'<<m.balance <<'\n';
                else                                 //找不到记录
                {
                    cout<<"物资号输入错误\n";
                    continue;
                }
                break;
            }
            case '2':                        //浏览文件
            {
                fdat.seekg( 0, ios::beg );        //读指针从文件头开始检索
                do                         //输出所有记录
                {
                    fdat.read((char*) & m , sizeof(material));
                    if( !endMark(m))        //不显示空记录
                        cout<<m.number<<'\t'<<m.name<<'\t'<<m.balance <<'\n';
                } while( !endMark(m) );        //判断文件是否结束
                break;
            }
            case 'Q':
            case 'q':  return;                    //退出查询,返回主菜单
        }
    }
    fdat.close();                                //关闭文件
}
//领料登记。根据物资号查找文件。如果找到,则用领料数修改库存量
void Lingliao( const char *fileDat )
{
    char choice;
    material m;
    int key;
    long num;
    fstream fdat(fileDat, ios::in|ios::out|ios::binary);   
    //以读/写方式打开文件
    cout<<"**********领料登记**********\n";
    while(1)
    {
        cout<<"请输入操作选择\n"
                <<"1:领料登记\t" <<"Q:退出\n";
        cin>>choice;
        switch( choice )
        {
            case '1':
            {
                fdat.seekg( 0, ios::beg );        //读指针从文件头开始检索
                cout<<"物资号(number):\n? ";
                cin>>key;
                do                                     //按物资号查找
                {  //读一个记录
                    fdat.read((char*) & m , sizeof(material));
                } while(m.number!=key && !endMark(m));        //判断是否找到
                if( m.number == key )        //找到记录
                {
                    cout<< m.number<<'\t'<<m.name<<'\t'<<m.balance<<'\n';
                    cout<<"销售数量:\n? ";
                    cin>>num;
                    if( num>0 && m.balance>=num )     //有足够库存量
                        m.balance -= num;                         //修改库存量
                    else                                                         //没有足够库存量
                    {
                        cout<<"数量输入错误\n";
                        continue;
                    }
                    fdat.seekp(-long(sizeof(material)),ios::cur);        //文件写指针复位
                    fdat.write((char*)&m, sizeof(material));        //写修改后记录
                    cout<<"现库存量\t\t"<<m.balance<<endl;
                }
                else                 //找不到记录
                     cout<<"物资号输入错误\n";
                break;
            }
            case 'Q' :
            case 'q' :  return;            //退出领料登记,返回主菜单
        }
    }
    fdat.close();                        //关闭文件
}
//判断是否为空标志记录
int endMark(material m)
{
    if( m.number==0 )
        return 1;
   return 0;
}

搜索更多相关主题的帖子: material balance include number choice 
2015-01-08 13:23
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:20 
这种排错最是闹心的,自己慢慢排吧   百分之八九十都是指针啊 内存啊 方面的错误

DO IT YOURSELF !
2015-01-08 13:40
快速回复:为什么下面这个程序的代码编译通过了,但程序运行时部分功能无法实现? ...
数据加载中...
 
   



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

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