用C语言制作小型商品信息管理系统过程中的问题
大神请默默飘过。。。
以下是第一次制作时的源码:
// 商品信息管理.cpp : 定义控制台应用程序的入口点。
//
// 小型商品信息管理系统.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<fstream>
#include<string>
#include<conio.h>
#include<iostream>
#include<sstream>
using namespace std;
//定义结构体
typedef struct goods{
string name;//商品名
string number;//商品编号
string area_of_producting;//出产地
string the_date_of_purchase;//进货日期
string sales_man;//进货商
int price;//商品单价
int stocks;//库存量
struct goods *next;
int i;//记录商品原始节点位置
goods() {//构造函数
name="\0";
number="\0";
area_of_producting="\0";
the_date_of_purchase="\0";
sales_man="\0";
price=0;
i=0;
next=NULL;
}
}Goods;
//函数声明
Goods* Search_the_massage_of_Goods(Goods* );
Goods* Delete_link_node(Goods *);
Goods* Insert_link_node(Goods*);
Goods* Create_link_node(Goods* );
Goods* Create_head();
void Input_the_massage_of_Goods(Goods *);
Goods* Sort_link_node(Goods *);
void Write_the_massage_of_one_Good_to_file(Goods *);
Goods* Read_the_massage_of_Goods_from_system();
//主函数
int main(){
while(1){
char ch='0';
Goods *p,*pr;
system("color A9");
cout<<"_____________________________________________\n";
cout<<(char)2<<"输入相应数字执行相应操作."<<(char)2<<"\n";
cout<<"1.录入商品信息"<<(char)2<<"\n";
cout<<"2.删除商品信息"<<(char)2<<"\n";
cout<<"3.查询商品信息"<<(char)2<<"\n";
cout<<"4.修改商品信息"<<(char)2<<"\n";
cout<<"5.插入商品信息"<<(char)2<<"\n";
cout<<"6.退出"<<(char)2<<"\n";
cout<<"_____________________________________________\n";
Goods *head=Read_the_massage_of_Goods_from_system();;
if(head==NULL){
head=Create_head();
}
for(;ch>'6'|| ch<'1';ch=_getch());
system("cls");
switch(ch){
case '1':
p=Create_link_node(head);
cout<<"是否立即写入商品信息 Y/N\n";
char ch;
for(;ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n';ch=_getch());
if(ch=='y'||ch=='Y') Input_the_massage_of_Goods(p);
Write_the_massage_of_one_Good_to_file(p);//将信息写入文件
break;
case '2':
Delete_link_node(head);
break;
case '3':
Search_the_massage_of_Goods(head);
break;
case '4':
cout<<"查询要修改的商品\n";
pr=Search_the_massage_of_Goods(head);
Input_the_massage_of_Goods(pr);
break;
case '5':
Insert_link_node(head);
break;
case '6':
exit(0);
break;
}
}
return 0;
}
Goods* Delete_link_node(Goods *head){
Goods *p,*pr;
cout<<"查询要删除的节点\n";
p=Search_the_massage_of_Goods(head);
if(p==head){
p=head;
head=p->next;
free(p);
}
else if(p->next=NULL){
for(pr=head;pr->next!=p;pr=pr->next);
free(pr);
pr=NULL;
p=NULL;
}
else{
for(pr=head;pr->next!=p;pr=pr->next);
pr->next=p->next;
free(p);
p=NULL;
}
return head;
}
//创建头节点,返回头节点的指针
Goods* Create_head(){
Goods *head;
head=new Goods();
head->i=1;
head->next=NULL;
return head;
}
//新建节点,传入头指针,如果头指针为空,将新建节作为头节点,否则将新建节
//插入至链表末尾,返回头指针
Goods* Create_link_node(Goods* head){
Goods *p,*pr;
p=new Goods();
(p->i)++;
if(head==NULL){
head=p;
}
else{
for(pr=head;pr->next!=NULL;pr=pr->next);
pr->next=p;
}
return head;
}
//新建节点,传入头指针,调用查询函数,插入节点至查询到的函数的前一节点
Goods* Insert_link_node(Goods*head){
Goods *pr,*p,*temp;
p=new Goods();
if(p==NULL)
{
cout<<"No enough mrmory!\n";
exit(0);
}
p->next=NULL;
if(head==NULL)
head=p;
else
{
cout<<"插入节点至查询到的函数的前一节点\n";
pr=Search_the_massage_of_Goods(head);
if(pr==head)
{
p->next=head;
head=p;
}
else
{
for(temp=head;temp->next==pr;temp=temp->next);
p=temp->next;
pr=p->next;
}
}
return head;
}
//传入头指针,调用查询函数,查询相应要删除的节点,返回头指针
Goods* Search_the_massage_of_Goods(Goods* head){
Goods* p;
while(1){
cout<<"__________________________________________\n";
cout<<"输入相应数字执行相应查询操作 \n";
cout<<"1.按商品名查询\n";
cout<<"2.按商品编号查询\n";
cout<<"按其余任意键退出\n";
cout<<"__________________________________________\n";
string s;
char ch;
for(;ch!='1'&&ch!='2'&&ch!='*';ch=_getch());
switch(ch){
case '1':
cout<<"请输入要查询的商品名";
cin>>s;
for(p=head;s!=p->name;p=p->next);
if(p==NULL) {
cout<<"未查找到\n";
break;
}
else
cout<<"商品名"<<p->name<<"商品编号"<<p->number<<"出产地"<<p->area_of_producting<<"进货商"<<p->sales_man<<"库存量"<<"进货日期"<<p->stocks<<p->the_date_of_purchase;
break;
case '2':
cout<<"请输入要查询的商品编号";
cin>>s;
for(p=head;s!=p->number;p=p->next);
if(p==NULL) {
cout<<"未查找到\n";
break;
}
else
cout<<"商品名"<<p->name<<"商品编号"<<p->number<<"出产地"<<p->area_of_producting<<"进货商"<<p->sales_man<<"库存量"<<"进货日期"<<p->stocks<<p->the_date_of_purchase;
break;
default:
goto a;
break;
}
}
a:;
return p;
}
void Input_the_massage_of_Goods(Goods *p){
cout<<"请输入商品编号";
getline(cin,p->number);
cout<<"请输入商品名称";
getline(cin,p->name);
cout<<"请输入商品出产地";
getline(cin,p->area_of_producting);
cout<<"请输入商品进货日期,中间用‘-’隔开";
getline(cin,p->the_date_of_purchase);
cout<<"请输入商品进货商";
getline(cin,p->sales_man);
cout<<"请输入商品库存量";
cin>>p->stocks;
cout<<"请输入商品单价";
cin>>p->price;
system("cls");
}
//排序函数,传入节点头指针,该函数要实现按商品单价排序和按商品库存量排序返回头指针
Goods* Sort_link_node(Goods *head){
return head;
}
//输入函数,将商品信息存储到文件中,便于下次文件的初始化读写,传入新建节点的指针,将其内容写入文件末尾
void Write_the_massage_of_one_Good_to_file(Goods *p){
ofstream file("the_massage_of_Goods.txt",ios::out|ios::ate);
//)用 ate 方式打开一个已存在的文件,文件指针自动移到文件末尾,数据可以写入到其中。
//用 in 方式打开文件只能用于输入数据,而且该文件必须已经存在
if(!file){//如果文件不存在
cout<< "不可以打开文件"<<endl;
exit(1);
}
//写文件
file<<p->i<<p->name<<p->number<<p->sales_man<<p->stocks<<p->area_of_producting<<p->price<<p->stocks<<'\n';
//关闭文件
file.close();
}
//在程序打开时将信息从文件读入,初始化信息
Goods* Read_the_massage_of_Goods_from_system(){
Goods *p,*head=Create_head();
ifstream rfile("the_massage_of_Goods.txt",ios::in); //in 方式打开文件只能用于输入数据,而且该文件必须已经存在
if(!rfile){
cout<< "不可以打开文件"<<endl;
exit(1);
}
string str;
for(p=head;getline(rfile,str);p=p->next){
istringstream sin(str);
p=new Goods();
sin>>p->i>>p->name>>p->number>>p->sales_man>>p->stocks>>p->area_of_producting>>p->price>>p->stocks;
}
//rfile.close();
return head;
}
这看上去好像是没什莫问题,可是在VS2008运行时,控制台一闪而过,,这是为甚末呢??小编也是苦思良久,终于得出答案,用 in 方式打开文件只能用于输入数据,而且该文件必须已经存在,所以我就在源文件出建立了the_massage_of_Goods.txt这个文件,可问题并没有解决,最后,小编在Goods* Read_the_massage_of_Goods_from_system()这个函数里加上了_getch();
Goods* Read_the_massage_of_Goods_from_system(){
Goods *p,*head=Create_head();
ifstream rfile("the_massage_of_Goods.txt",ios::in); //in 方式打开文件只能用于输入数据,而且该文件必须已经存在
_getch();
if(!rfile){
cout<< "不可以打开文件"<<endl;
exit(1);
}
string str;
for(p=head;getline(rfile,str);p=p->next){
istringstream sin(str);
p=new Goods();
sin>>p->i>>p->name>>p->number>>p->sales_man>>p->stocks>>p->area_of_producting>>p->price>>p->stocks;
}
//rfile.close();
return head;
}
这时控制台终于停了下来,显示一个我设计的一个菜单界面
可只要按一下,控制台又会消失,到底是哪出了问题呢??经过一再的检查代码,终于发现是这里:

只能说是文件没有成功打开,接下来我们可以试试,我对Goods* Read_the_massage_of_Goods_from_system()函数做以下修改,如果文件打开失败,那末就会打出一连串#字符号并显示不可打开文件:
Goods* Read_the_massage_of_Goods_from_system(){
Goods *p,*head=Create_head();
ifstream rfile("the_massage_of_Goods.txt",ios::in); //in 方式打开文件只能用于输入数据,而且该文件必须已经存在
if(!rfile){
cout<< "不可以打开文件"<<endl;
cout<<"#################################################";
_getch();
exit(1);
}
string str;
for(p=head;getline(rfile,str);p=p->next){
istringstream sin(str);
p=new Goods();
sin>>p->i>>p->name>>p->number>>p->sales_man>>p->stocks>>p->area_of_producting>>p->price>>p->stocks;
}
//rfile.close();
return head;
}
运行后发现:

很明显,文件打开失败了,这又是怎末回事呢??
一般操作系统都会隐藏文件后缀,如果设置了隐藏常见文件类型,就会有两个后缀,所以就只能检测文件是否存在了,如果不存在,则重新创建一个,于是小编对Goods* Read_the_massage_of_Goods_from_system()作了如下修改:
//在程序打开时将信息从文件读入,初始化信息
Goods* Read_the_massage_of_Goods_from_system(){
if(exist("the_massage_of_Goods.txt")==0) {
ifstream rfile("the_massage_of_Goods.txt",ios::out);
rfile.close();
} //如果文件不存在,则重新创建一个文件
Goods *p,*head=Create_head();
ifstream rfile("the_massage_of_Goods.txt",ios::in); //in 方式打开文件只能用于输入数据,而且该文件必须已经存在
if(!rfile){
cout<< "不可以打开文件"<<endl;
exit(1);
}
string str;
for(p=head;getline(rfile,str);p=p->next){
istringstream sin(str);
p=new Goods();
sin>>p->i>>p->name>>p->number>>p->sales_man>>p->stocks>>p->area_of_producting>>p->price>>p->stocks;
}
rfile.close();
return head;
}
int exist(char *file) //传入想要判断的路径字符串指针
{
FILE *fp;
fp=fopen(file,"r"); //fopen是一个C库函数,用于打开文件,"r"是只读模式,在这种模式下,如果文件存在,则能成功以只读模式打开,fopen返回一个非0的文件描述符,如果文件不存在,则fopen返回NULL(NULL意思是空)。正好可以利用这一点来判断文件是否存在
if(fp=NULL)
return 0; //不存在返回0
else
{
fclose(fp); //存在的话,要先把之前打开的文件关掉
return 1; //然后返回1
}
}
最终调试成功,谢谢诸位。。。
用C语言制作小型商品信息管理系统过程中的问题的更多相关文章
- PHP基础示例:商品信息管理系统v1.1[转]
实现目标:使用php和mysql写一个商品信息管理系统,并带有购物车功能 一.创建数据库和表 1.创建数据库和表:demodb 2.创建表格:goods 字段:商品编号,商品名称,商品类型,商品图 ...
- PHP基础示例:商品信息管理系统v1.1
实现目标:使用php和mysql写一个商品信息管理系统,并带有购物车功能 一.创建数据库和表 1.创建数据库和表:demodb 2.创建表格:goods 字段:商品编号,商品名称,商品类型,商品图片, ...
- 简易商品信息管理系统——首个Web项目
正文之前 在学习了一段时间的Java Web的内容之后,当然需要有个项目来练练手,我相信大多数人的首选项目都是信息管理系统吧,所以我选择了商品信息管理系统 目前项目源码已全部上传至GitHub,欢迎大 ...
- 【Java Web】简易商品信息管理系统——首个Web项目
正文之前 在学习了一段时间的Java Web的内容之后,当然需要有个项目来练练手,我相信大多数人的首选项目都是信息管理系统吧,所以我选择了商品信息管理系统 目前项目源码已全部上传至GitHub,欢迎大 ...
- Java Swing设计简单商品信息管理系统(java swing+mysql+eclipse)
一.概述 为了管理好商店库存信息,提升店铺管理工作效率,结合实际工作需要,设计和开发本系统,主要用于商店商品信息维护出入库等.包含商品库存信息查看.商品信息修改,新增商品信息,删除信息等功能. 二.功 ...
- C语言大作业---学生信息管理系统
xxxx信息管理系统 简介 因为大作业规定的踩分项就那么多,为了不浪费时间 + 得分,就写成这样.现在看看,命名不规范,书写风格糟糕,全塞在一个源代码中······ 不过,应付大作业是没问题的 实验报 ...
- 制作移动端手机网站过程中的SEO优化方法技巧
据国内三大运营商数据来看,中国的手机用户数已达10亿,超过2/5的移动用户每个月都会从手机终端访问网页,如今的移动端手机网站比例肯定有提升,但是对于这些存在的移动版本网站来说,马海祥查看了很大一部分手 ...
- 嵌入式C语言自我修养 09:链接过程中的强符号和弱符号
9.1 属性声明:weak GNU C 通过 __atttribute__ 声明weak属性,可以将一个强符号转换为弱符号. 使用方法如下. void __attribute__((weak)) fu ...
- S1 商品信息管理系统
#include <iostream> #include <cstdio> #include <cstdlib> #include <iomanip> ...
随机推荐
- JSON 小记
JSON是在web应用中频繁使用的一种数据结构,在使用过程中经常出现格式错误等等问题,如果能清晰的了解JSON的构成,那将会避免这些错误 英文好的可以查看原文: 地址:http://www.codep ...
- 接触CrackMe 第一个
今天刚接触这个 做了一个简单的. 用Onlydbg加载之后,对GetDlgItemTextA函数下断点,因为程序是在控件上获取数据的. Register输入Name和Serial点击Ok之后,断点响应 ...
- mysql学习(八)数据表类型-字符集
数据存储引擎: MyISAM:强化快速读取操作. 也有缺点.一些功能不支持 InnoDB:支持一些MyIASM一些不支持的功能 缺点:占用空间大 对比 ...
- (转)解决JSP路径问题的方法(jsp文件开头path, basePath作用)
在JSP中的如果使用 "相对路径" 则有可能会出现问题. 因为 网页中的 "相对路径" , 他是相对于 "URL请求的地址" 去寻找资源. ...
- SQL字符型字段按数字型字段排序实现方法(转)
由于是按字母顺序排列,所以123排在了2的前面,显然不符合我们的要求,那么怎样才能按照我们预想的数字顺序排序呢 ORDER BY `meta_value` 那么按得分排序得到的结果可能是:1101 ...
- cocos2d-x中常见的场景切换
本文转载自:http://www.cnblogs.com/linux-ios/archive/2013/04/09/3010779.html bool HelloWorld::init() { /// ...
- Struts2技术详解(转)
1, 当Action设置了某个属性后,Struts将这些属性封装一个叫做Struts.valueStack的属性里.获取valueStack对象: ValueStack vs = (ValueStac ...
- Android——仿QQ聊天撒花特效
实现这样的效果,你要知道贝塞尔曲线,何谓贝塞尔曲线?其实就是曲线,嘿嘿,关于曲线的概念大家可以去 Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和 ...
- memcache 安装教程
memcached:官网http://memcached.org/ 说明:memcached本身没有Linux版本,网上的windows 版本都是个人开发的. memcached和memcache区别 ...
- JavaEE Tutorials (23) - 资源适配器和契约
23.1什么是资源适配器362 23.1.1管理契约363 23.1.2通用工作上下文契约364 23.1.3出站和入站契约36423.2元数据注解36523.3公共客户端接口36623.4对Java ...