为什么下面这个程序的代码编译通过了,但程序运行时部分功能无法实现?求解!
#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;
}