c语言zgi
A. 关于C编程的问题
主要是把基础的东西学扎实了,比如c中的结构、函数、指针......再学一些数据结构方面携袜的知识.以后再做比较大的查询系统时,就会思路很清晰的.下面给你一个有关企业职工管理的查询系统.以做参考!其实一些查询系统的基本思路都是一样的.比如电话系统查询、图书管理系统等等.
还有具体把你的查询系统的功能描述一下:e.g.要能输入姓名查找到该用户的电话,输入电话号码要能对应查找出该号码的机主姓名.还要能实现电话的插入、姓名和号码拿纯的更改保存等等.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define N 100
struct employee//职工基本情况
{
int num;//工号
int position;//职位1为董事长2为总经消隐咐理3为副总经理等
char name[8];//姓名
char sex[2];//性别f为女m为男
int age;//年龄
int cult;//文化程度1为专家2为博士3为硕士4为学士5为其他
int salary;//工资
int state;//健康情况分为good,general,bad
}em[N];
struct communication//职工通讯录
{
char name[8];
char officetel[13];
char hometel[13];
char handtel[13];
char address[13];
}empc[N];
struct empsalary//职工工资与姓名的文件
{
char name[8];
int salary;
}emps[N];
void manage();
void query();
void communicate();
void input();
void display();
void change();
void del();
void add();
void count();
int changeposition();
int changecult();
int changesalary();
int changestate();
void querysalary();
void creat();
void inputcommunicate();
void querycommunicate();
void changecommunicate();
void changetel1();
void changetel2();
void changetel3();
char password[7]="123456";
void main()
{
int choice;
char s[7];
int flag=0;
int n=3;
do
{
printf("请你输入密码:\n");
scanf("%s",s);
if(!strcmp(s,password))//若密码正确
{
printf("恭喜你成功登陆了\n\n\n");
flag=1;
break;
}
else
{
printf("输入有错误请重新输入:\n");
n--;
}
}while(n>0);
if(!flag)
{
printf("你的输入次数已到再见\n");
}
do
{
printf("~~~~~~~~~~\t\t\t~~~~~~~~~~~~\n");
printf("\t\t欢迎进入职工管理系统中文版\n");
printf("制作人:李华诗\t班级:计034班\t学号:2003041150\n");
printf("联系地址:广西工学院\n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("\t\t请你选择操作类型:\n");
printf("==============\t\t==============\n");
printf("\t\t1进入管理系统\n");
printf("\t\t2进入查询系统\n");
printf("\t\t3进入通讯录\n");
printf("\t\t0退出系统\n");
printf("==============\t\t==============\n");
printf("说明:版权归作者所有违者必究\n\n\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
manage();
break;
case 2:
query();
break;
case 3:
communicate();
break;
case 0:
{
printf("谢谢使用再见\n");
exit(0);
}
default:
{
printf("输入有错误请重新输入:\n");
return;
}
}
}while(1);
}
void manage()
{
int choicemanage;
char choice='y';
while(choice=='y'||choice=='Y')
{
printf("\t\t欢迎进入管理系统\n");
printf("===================\n");
printf("\t\t请你选择操作类型:\n");
printf("\t\t1输入职工信息\n");
printf("\t\t2显示职工信息\n");
printf("\t\t3修改职工信息\n");
printf("\t\t4追加一个职工信息\n");
printf("\t\t5删除一个职工信息\n");
printf("\t\t6统计职工信息\n");
printf("\t\t0返回\n");
printf("=====================\n");
scanf("%d",&choicemanage);
switch(choicemanage)
{
case 1:
input();//输入职工信息
break;
case 2:
display();//显示职工信息
break;
case 3:
change();//修改职工信息
break;
case 4:
add();//追加一个职工信息
break;
case 5:
del();//删除一个职工信息
break;
case 6:
count();//统计职工信息
break;
case 0:
printf("谢谢你的使用再见\n");
return;
default:
printf("你的输入有错请重新输入\n");
}
printf("是否继续管理?(y/n)");
scanf("%s",&choice);
}
if(toupper(choice)=='N'||(choice)=='n')
{
printf("输入完毕,任意键返回\n");
getch();
return;
}
}
void input()
{
FILE *fp;
int i=0;
char choiceinput='y';
if((fp=fopen("employee.txt","w"))==NULL)
return;
while(choiceinput=='y'||choiceinput=='Y')
{
i++;
printf("第%d个职工\n",i);
printf("\n");
printf("请你输入工号:\n");//输入工号
scanf("%d",&em[i].num);
printf("\n");
printf("请你输入职位:\n");//输入职位
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
scanf("%d",&em[i].position);
printf("\n");
printf("请你输入姓名:\n");//输入姓名
scanf("%s",em[i].name);
printf("\n");
printf("请你输入性别以m为男f为女:\n");//输入性别
scanf("%s",em[i].sex);
printf("\n");
printf("请你输入文化程度:\n");//输入文化程度
printf("1为专家2为博士3为硕士4为学士5为其他\n");
scanf("%d",&em[i].cult);
printf("\n");
printf("请你输入工资:\n");//输入工资
scanf("%d",&em[i].salary);
printf("\n");
printf("请你输入身体情况:\n");//身体情况
printf("1好2为一般3为差\n");
scanf("%d",&em[i].state);
printf("\n");
printf("是否继续输入?(y/n)\n");
scanf("%s",&choiceinput);
fwrite(&em[i],sizeof(struct employee),1,fp);
}
if(toupper(choiceinput)=='N')
{
fclose(fp);
printf("输入完毕,任意键返回\n");
getch();
return;
}
}
void display()//显示职工信息
{
FILE *fp;
int i;
if((fp=fopen("employee.txt","r"))==NULL)
return;
printf("输出结果:\n");
printf("工号 职位 姓名 性别 文化程度 工资 身体情况\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工号%d\n",em[i].num);
printf("职位为%d\n",em[i].position);
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
printf("姓名为%s\n",em[i].name);
printf("性别为%s\n",em[i].sex);
printf("其中m为男f为女\n");
printf("文化程度为%d\n",em[i].cult);
printf("1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d\n",em[i].salary);
printf("身体情况为%d\n",em[i].state);
printf("1好2为一般3为差\n");
}
printf("完毕按任意键返回\n");
getch();
fclose(fp);
return;
}
void change()
{
FILE *fp;
int i;
char chname[8];
int choicechange;
printf("请你输入要修改的人的姓名:\n");
scanf("%s",&chname);
if((fp=fopen("employee.txt","w+"))==NULL)
{
printf("不能够打开这个文件\n");
return;
}
for(i=0;i<N;i++)
{
if(strcmp(chname,em[i].name)==0)
{
printf("这是你要修改的人的信息\n");
printf("工号为%d职位为%d姓名为%s性别为%s文化程度为%d工资为%d身体为%d\n",em[i].num,em[i].position,em[i].name,em[i].sex,em[i].cult,em[i].salary,em[i].state);
printf("------------------------------------------------------------\n");
printf("请你输入要修改的部分:\n");
printf("======================\n");
printf("1修改职位\n");
printf("2修改文化程度\n");
printf("3修改工资\n");
printf("4修改身体情况\n");
printf("0退出系统\n");
printf("======================\n");
printf("请选择\n");
scanf("%d",&choicechange);
switch(choicechange)
{
case 1:
em[i].position=changeposition();
break;
case 2:
em[i].cult=changecult();
break;
case 3:
em[i].salary=changesalary();
break;
case 4:
em[i].state=changestate();
break;
case 0:
return;
default :
printf("输入有错误");
}
fwrite(&em[i],sizeof(struct employee),1,fp);
}
}
fclose(fp);
printf("操作完成按任意键返回\n");
getch();
return;
}
int changeposition()
{
int newposition;
printf("请你输入新职位:\n");
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
scanf("%d",&newposition);
return(newposition);
}
int changecult()
{
int newcult;
printf("请你输入新的文凭:\n");
printf("1为专家2为博士3为硕士4为学士5为其他\n");
scanf("%d",&newcult);
return(newcult);
}
int changesalary()
{
int newsalary;
printf("请你输入新的工资:\n");
scanf("%d",&newsalary);
return(newsalary);
}
int changestate()
{
int newstate;
printf("请你输入现在的身体情况:\n");
printf("1好2为一般3为差\n");
scanf("%d",&newstate);
return(newstate);
}
void add()//追加一个职工信息
{
struct employee emp;
FILE *fp;
int i=0;
if((fp=fopen("employee.txt","ab+"))==NULL)
{
printf("不能够打开这个文件\n");
getch();
return;
}
printf("请你输入新人的内容:\n");
printf("请你输入工号:\n");//输入工号
scanf("%d",&emp.num);
printf("请你输入职位:\n");//输入职位
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
scanf("%d",&emp.position);
printf("请你输入姓名:\n");//输入姓名
scanf("%s",emp.name);
printf("请你输入性别以m为男f为女:\n");//输入性别
scanf("%s",emp.sex);
printf("请你输入文化程度:\n");//输入文化程度
printf("1为专家2为博士3为硕士4为学士5为其他\n");
scanf("%d",&emp.cult);
printf("请你输入工资:\n");//输入工资
scanf("%d",&emp.salary);
printf("请你输入身体情况:\n");//身体情况
printf("1好2为一般3为差\n");
scanf("%d",&emp.state);
fwrite(&emp,sizeof(struct employee),1,fp);
rewind(fp);
printf("插入完毕,按任意键返回\n");
getch();
fclose(fp);
return;
}
void del()//删除一个职工信息
{
int i=0;
char delname[8];
FILE *fp;
if((fp=fopen("employee.txt","w"))==NULL)
{
printf("文件为空,不能够打开\n");
printf("按任意键返回\n");
getch();
return;
}
printf("请你输入要删除的人的姓名:\n");//删除的职工的信息
scanf("%s",delname);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,delname)!=0)
fwrite(&em[i],sizeof(struct employee),1,fp);
}
fclose(fp);
if((fp=fopen("employee.txt","r"))==NULL)//显示新的职工的信息
return;
printf("新的职工的信息为:\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工号%d",em[i].num);
printf("职位为%d",em[i].position);
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
printf("姓名为%s",em[i].name[8]);
printf("性别为%s",em[i].sex[2]);
printf("其中m为男f为女");
printf("文化程度为%d",em[i].cult);
printf("1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d",em[i].salary);
printf("身体情况为%d",em[i].state);
printf("1好2为一般3为差\n");
fclose(fp);
}
}
void count()
{
FILE *fp;
int i=0;
int num=0;//总人数统计
int mnum=0,fnum=0;//性别人数统计
int expernum=0,doctornum=0,masternum=0,bechelornum=0,othernum=0;//学位人数统计
int dsznum=0,zglnum=0,fzglnum=0,glnum=0,fglnum=0;//职位人数统计
int mishunum=0,jsynum=0,lbnum=0,ygnum=0;
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能够打开这个文件\n");
printf("按任意键继续\n");
getch();
return;
}
do
{
fread(&em[i],sizeof(struct employee),1,fp);
if(feof(fp))
break;
num++;
if(strcmp(em[i].sex,"m")==0)
mnum++;
if(strcmp(em[i].sex,"f")==0)
fnum++;
if(em[i].cult==1)
expernum++;
if(em[i].cult==2)
doctornum++;
if(em[i].cult==3)
masternum++;
if(em[i].cult=4)
bechelornum++;
if(em[i].cult=5)
othernum++;
if(em[i].position==1)//职位统计
dsznum++;
if(em[i].position==2)
zglnum++;
if(em[i].position==3)
fzglnum++;
if(em[i].position==4)
glnum++;
if(em[i].position==5)
fglnum++;
if(em[i].position==6)
mishunum++;
if(em[i].position==7)
jsynum++;
if(em[i].position==8)
lbnum++;
if(em[i].position==9)
ygnum++;
i++;
}while(1);
printf("总人数为%d\n",num);
printf("====性别分类=====\n");
printf("男人数为%d\n",mnum);
printf("女人数为%d\n",fnum);
printf("=====文凭分类=====\n");
printf("专家数为%d\n",expernum);
printf("博士数为%d\n",doctornum);
printf("硕士数为%d\n",masternum);
printf("学士数为%d\n",bechelornum);
printf("其他的数为%d\n",othernum);
printf("=====职位分类========\n");
printf("董事长数为%d\n",dsznum);
printf("总经理数为%d\n",zglnum);
printf("副总经理数为%d",fzglnum);
printf("经理数为%d",glnum);
printf("副经理数为%d",fglnum);
printf("秘书数为%d",mishunum);
printf("技术员数为%d",jsynum);
printf("领班人数为%d",lbnum);
printf("员工数为%d",ygnum);
fclose(fp);
return;
}
void query()
{
FILE *fp;
int i=0;
char quename[8];
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能够打开文件,按任意键返回\n");
getch();
return;
}
printf("请你输入要查询的人的姓名\n");
scanf("%s",quename);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,quename)==0) /*找到,并显示该职工记录*/
{
printf("\t\t\n查询到的职工号或姓名为的信息如下:\n");
printf("以下是你要查询的人的信息\n");
printf("工号%d",em[i].num);
printf("职位为%d",em[i].position);
printf("\t1为董事长2为总经理3为副总经理\n");
printf("\t4为经理5为副经理6为秘书\n");
printf("\t7为技术员8为领班9为员工\n");
printf("姓名为%s",em[i].name);
printf("性别为%s",em[i].sex);
printf("\t其中m为男f为女");
printf("文化程度为%d",em[i].cult);
printf("\t1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d",em[i].salary);
printf("身体情况为%d",em[i].state);
printf("\n");
printf("查询完毕,按任意键返回\n");
getch();
fclose(fp);
return;
}
}
printf("没有这样的人,按任意键返回\n");
getch();
fclose(fp);
return;
}
void querysalary()
{
int i;
FILE *fp1,*fp2;
creat();
if((fp1=fopen("employee.txt","w+"))==NULL)
return;
for(i=0;fread(&em[i],sizeof(struct employee),1,fp1)!=0;i++)
{
printf("输出结果为:\n");
printf("工号%d",em[i].num);
printf("职位为%d",em[i].position);
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
printf("姓名为%s",em[i].name[8]);
printf("性别为%s",em[i].sex[2]);
printf("其中m为男f为女");
printf("文化程度为%d",em[i].cult);
printf("1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d",em[i].salary);
printf("身体情况为%d",em[i].state);
printf("1好2为一般3为差\n");
strcpy(emps[i].name,em[i].name);
emps[i].salary=em[i].salary;
}
if((fp2=fopen("empsalary.txt","w"))==NULL)
return;
for(i=0;i<N;i++)
fwrite(&emps[i],sizeof(struct empsalary),1,fp2);
fclose(fp1);
fclose(fp2);
}
void creat()
{
FILE *fp;
if((fp=fopen("employee.txt","w+"))==NULL)
return;
input();
fclose(fp);
}
void communicate()
{
int choicecommunicate;
printf("欢迎进入通讯录系统\n");
printf("请你选择操作类型:\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("1为输入通讯录信息\n");
printf("2为查询通讯录信息\n");
printf("3为修改通讯录信息\n");
printf("0为退出通讯录系统\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
scanf("%d",&choicecommunicate);
switch(choicecommunicate)
{
case 1:
inputcommunicate();
break;
case 2:
querycommunicate();
break;
case 3:
changecommunicate();
break;
case 0:
{
printf("谢谢使用再见\n");
printf("按任意键返回\n");
getch();
return;
}
default:
printf("输入有错\n");
}
}
void inputcommunicate()
{
FILE *fp;
int choiceincom='y';
int i=0;
if((fp=fopen("empcom.txt","w"))==NULL)
{
printf("不能够打开文件\n");
printf("任意键返回\n");
getch();
return;
}
printf("请你输入通讯录的信息:\n");
while(choiceincom=='y'||choiceincom=='Y')
{
i++;
printf("第%d个职工\n",i);
printf("请你输入姓名:\n");
scanf("%s",empc[i].name);
printf("请你输入办公室电话号码:\n");
scanf("%s",empc[i].officetel);
printf("请你输入家庭电话号码:\n");
scanf("%s",empc[i].hometel);
printf("请你输入手机号码:\n");
scanf("%s",empc[i].handtel);
printf("请你输入地址:\n");
scanf("%s",empc[i].address);
printf("是否继续输入?(y/n)\n");
choiceincom=getch();
fwrite(&empc[i],sizeof(struct communication),1,fp);
}
if(toupper(choiceincom)=='N')
{
fclose(fp);
printf("输入完毕,任意键返回\n");
return;
}
}
void querycommunicate()
{
FILE *fp;
int i=0;
char qcname[8];
if((fp=fopen("empcom.txt","r"))==NULL)
{
printf("不能够打开文件,按任意键返回\n");
getch();
return;
}
printf("请你输入要查询的人的姓名:\n");
scanf("%s",qcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,qcname)==0)
{
printf("以下为您所要求的信息:\n");
printf("姓名为%s\n",empc[i].name);
printf("办公室电话号码为%s\n",empc[i].officetel);
printf("家庭电话号码为%s\n",empc[i].hometel);
printf("手机号码为%s\n",empc[i].handtel);
printf("家庭地址为%s\n",empc[i].address);
printf("查询完毕,按任意键返回\n");
getch();
fclose(fp);
return;
}
}
printf("没有这样的人,按任意键返回\n");
getch();
fclose(fp);
return;
}
void changecommunicate()
{
FILE *fp;
int i=0;
char chcname[8];
int choicecom;
if((fp=fopen("empcom.txt","w+"))==NULL)
{
printf("打不开文件按任意键返回\n");
getch();
return;
}
printf("请你输入你要修改的人的姓名:\n");
scanf("%s",chcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,chcname)==0)
{
printf("以下为您所要修改的人的信息:\n");
printf("姓名为%s\n",empc[i].name);
printf("办公室电话号码为%s\n",empc[i].officetel);
printf("家庭电话号码为%s\n",empc[i].hometel);
printf("手机号码为%s\n",empc[i].handtel);
printf("家庭地址为%s\n",empc[i].address);
printf("请你选择要修改的东西:\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("1修改办公室电话号码\n");
printf("2修改家庭电话号码\n");
printf("3修改手机电话号码\n");
printf("0退出系统\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
scanf("%d",&choicecom);
switch(choicecom)
{
case 1:
changetel1();
break;
case 2:
changetel2();
break;
case 3:
changetel3();
break;
case 0:
return;
default:
printf("输入有错\n");
}
}
}
}
void changetel1()
{
printf("参照上面有时间再编\n");
}
void changetel2()
{
printf("参照上面\n");
}
void changetel3()
{
printf("参照上面\n");
}
==============================================
编程爱好者群:24410693 只要对c有兴趣就可以申请加入本群.
B. 如何异步读取ftp
一:开发背景
由于需要对多个服务器发布大的数据包,所以自己在LINUX用c语言,开发了一个传送器工具。因为上传时需要支持断点续传,所以自己参考ftp-rfc959和一些文章开发了这个支持断点续传的上传工具。整个工具分两部分开发的:一是支持断点续传的Ftp工具,包含下载和上传功能。二是同时对多个服务器发布不同数据包的传送器工具。本文只是对断点续传的商船和下载作探讨。
二:实现
其实Ftp上传下载的实现很简单,首先Ftp服务器端要支持文件的定位,
然后就是通过建立的Socket用Ftp服务器命令和服务器交互.
有些也可以通过Socket做自己的客户端和服务器端,但是有些服务器是自己能管理控制的,而且原来自己也写过一些这样C/S模式的工具,简单消息的传送接收还不错。
但用来传输文件效率很低,比文件传送协议FTP(File Transfer Protocol)差的太多。 利用Ftp的服务端可以省去服务器端的开发,而且可以向任何开放Ftp服务的服务器上传送文件,可以不考虑对方安装的
是什么的操作系统。
三:FTP
文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务。FTP 的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。
FTP 使用客户服务器方式。
一个 FTP 服务器进程可同时为多个客户进程提供服务。FTP的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。
A、通常的方式:
控制连接在整个会话期间一直保持打开,FTP 客户所发出的传送请求通过控制连接发送给控制进程,但控制连接并不用来传送文件,实际用于传输文件的是“数据连接”。
控制进程在接收到 FTP 客户发送来的文件传输请求后就创建一个“数据传送进程”和一个“数据连接”,并将数据连接连接到“数据传送进程”,数据传送进程实际完成文件的传送,在传送完毕后关闭“数据传送连接”并结束运行
当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口(21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口(20)与客户进程所提供的端口号码建立数据传送连接。
B、 被动模式:
FTP客户端发出的连接请求,一般通过服务器的21号端口建立控制连接,专门用来传输一些字符串命令和响应信息。控制命令通道一定是由客户端向服务器的连接(默认的端口是21,也可以指定端口,这要看服务器的设置)。
PASV:通过控制通道通过发送PASV 服务器命令到 FTP服务器。请求建立被动模式数据连接通道。 (客户端的命令 passive)
服务器返回连接的信息(227 Entering Passive Mode (70,0,10,62,120,18) )地址和端口。端口=最后第二位乘256再加上最后一位(120*256+18)。(注意端口设为0的情况) 如: *f_port = atoi(port_1) * 256 + atoi(port_2);
服务器端和客户端身份转换,原客户端在本地建立监听,监听来自原服务器远端的连接请求建立数据连接通道。
四、 实现方法:
A、下载:
1、向服务器发送“REST + 本地文件长度”,告诉服务器,客户端要断点下载了。这时服务器还不知道客户端要下载的文件名;
2、向服务器发送"RETR + 文件名",通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。
3、客户端定位本地文件指针偏移到文件末尾;
4、两端的准备工作都做完了以后,客户端创建socket,以被动或非被动方式建立数据链接,循环调用recv接收文件数据并追加到本地文件末尾;
B、上传:
1、获取服务器上和本地要上传文件的同名文件大小;
2、向服务器发送“APPE + 文件名”,通知服务器,从数据通道发送给你的数据要附加到这个文件末尾。
3、定位本地文件指针,文件指针偏移到指定位置,这个位置与FTP服务器上文件大小相同的位置。
4、从文件指针处读数据并发送。
C、Ftp服务器命令
我们平时使用的命令,大多是客户端的。服务器端的命令可以参考下面:
命令 描述
ABOR 中断数据连接程序 ACCT <account> 系统特权帐号
ALLO <bytes> 为服务器上的文件存储器分配字节 APPE <filename> 添加文件到服务器同名文件
CDUP <dir path> 改变服务器上的父目录 CWD <dir path> 改变服务器上的工作目录
DELE <filename> 删除服务器上的指定文件 HELP <command> 返回指定命令信息 LIST <name> 如果是文件名列出文件信息,如果是目录则列出文件列表 MODE <mode> 传输模式(S=流模式,B=块模式,C=压缩模式)
MKD <directory> 在服务器上建立指定目录 NLST <directory> 列出指定目录内容
NOOP 无动作,除了来自服务器上的承认 PASS <password> 系统登录密码
PASV 请求服务器等待数据连接 PORT <address> IP 地址和两字节的端口 ID PWD 显示当前工作目录 QUIT 从 FTP 服务器上退出登录
REIN 重新初始化登录状态连接 REST <offset> 由特定偏移量重启文件传递
RETR <filename> 从服务器上找回(复制)文件 RMD <directory> 在服务器上删除指定目录
RNFR <old path> 对旧路径重命名 RNTO <new path> 对新路径重命名
SITE <params> 由服务器提供的站点特殊参数 SMNT <pathname> 挂载指定文件结构
STAT <directory> 在当前程序或目录上返回信息 STOR <filename> 储存(复制)文件到服务器上
STOU <filename> 储存文件到服务器名称上 STRU <type> 数据结构(F=文件,R=记录,P=页面)
SYST 返回服务器使用的操作系统 TYPE <data type> 数据类型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系统登录的用户名
D、服务器返回的部分数字代码含义
125 Data connection already open; Transfer starting.
226 Transfer complete.
227 Entering Passive Mode (127,0,0,1,4,18).
230 User xxxxx logged in.
331 Password required for xxxxx.
425 Can’t open data connection.
226 Closing data connection.
200 return a state of TYPE or MODE commond
220 connection state
五、关于Socket
关于Socket编程有很多参考资料,这里不作详细说明
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口
Socket 是一个基本的通信机制Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
常用的Socket类型有两种:
A、流式Socket(SOCK_STREAM):流式是一种面向连接的Socket,针对于面向连接的TCP服务应用。
B、数据报式Socket(SOCK_DGRAM):数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
Socket的程序是一种C/S结构,分客户端和服务器端。
A、客户端
– 初始化Socket
– 连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了
– 客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端
– 客户端读取数据,最后关闭连接,一次交互结束。
B、服务器端
- 初始化Socket
- 端口绑定(bind)
- 监听(listen)端口
- 调用accept阻塞,等待客户端连接
在这里我们使用的就是面向连接的流式Socket,只编写客户端的程序。
六、代码:
下面仅提供一个编译过并在使用中的函数简单的说明其实现原理,
需要有一点C语言和Linux/UNIX的socket编程基础即可理解。
只是建立连接和传输部分的一个函数。当文件传出结束或断开时,
可以调用检查函数看是否成功,字节是否正常等,如果不正常结束,
可以再次循环调用它并定为服务器文件的字节,继续传输。
其他的控制和功能都在其他函数中实现。为移植方便使用标准C语法符合C89标准。
code:
/*****************************************************************
* FileName: uftt_ver5.c *
* Company: algorithmics china lib Co.,Ltd. *
* Author: G.L.Zhang --- zglcl008 *
* Time: [2006-12-20] *
* Description: uninterrupted file transfers tools *
*****************************************************************/
int f_file_trans(const char *ft_addr, int ft_port, const char *ft_usr,const char *ft_pwd, const char *ft_opt, const char *ft_src, char *ft_obj, int ft_flg)
{
int cmd_sock = -1;
int dat_sock = -1;
int stream_sock= -1;
int dat_port = 0;
char dat_buffer[1024*5];
struct sockaddr_in f_server;
struct sockaddr_in f_datasvr;
unsigned char *pasv_ip = NULL;
unsigned char *pasv_port = NULL;
unsigned int len_addr = 0;
long rc_size = 0;
/* long svr_file_size = 0; */
long file_size = 0;
int rc = 0;
if (ft_addr == NULL || ft_usr == NULLft_pwd == NULL ||
ft_opt == NULL || ft_src == NULL || ft_obj == NULL ||
ft_port == 0 || ft_flg < 0) {
err_quit("--- file transfers parameter error");
}
/* get ftp commomd socket */
if ((cmd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("cmmond socket");
err_quit("--- command sock error");
}
bzero(&f_server, sizeof(f_server));
f_server.sin_family = AF_INET;
f_server.sin_port = htons(ft_port);
f_server.sin_addr.s_addr = inet_addr(ft_addr);
if (connect(cmd_sock, (struct sockaddr *)&f_server, sizeof(f_server)) < 0) {
perror("connect");
err_quit("--- command sock error");
}
rc = uftt_cmd(dat_buffer, cmd_sock, NULL);
if (rc == 220)
printf("-1- %d OK\n", rc);
else
printf("-1- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"USER %s",ft_usr);
if (rc == 331)
printf("-2- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"PASS %s",ft_pwd);
if (rc == 230)
printf("-3- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "TYPE I");
if (rc == 200)
printf("-41- %d OK\n", rc);
else
printf("-41- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "MODE S");
if (rc == 200)
printf("-42- %d OK\n", rc);
else
printf("-42- %d ERR\n", rc);
memset(dat_buffer, ''\0'', sizeof(dat_buffer));
rc = uftt_cmd(dat_buffer, cmd_sock, "PASV");
if (rc == 227)
printf("-5- %d OK\n", rc);
else
printf("-5- %d ERR\n", rc);
#ifdef ZGL_DEBUG
printf("-5- %d %s\n", rc, dat_buffer);
#endif
/* get passive port */
dat_port = 0;
if ((rc = get_svr_port(dat_buffer, (int *)&dat_port)) < 0)
err_quit("data stream port error");
#ifdef ZGL_DEBUG
printf("--- pasive port=[%d]\n", dat_port);
#endif
if ((dat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("data socket");
err_quit("--- data sock error");
}
len_addr = sizeof(f_datasvr);
bzero(&f_datasvr, sizeof(f_datasvr));
rc = getsockname(cmd_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
f_datasvr.sin_port = htons(dat_port);
/* 0=all port or appoint port TEST OK ***
f_datasvr.sin_port = htons(dat_port);
f_datasvr.sin_port = 0;
*/
if (bind(dat_sock,(struct sockaddr *)&f_datasvr,len_addr) == -1)
err_sys("--- data sock bind error");
if (listen(dat_sock,1) == -1)
err_sys("--- data sock bind error");
rc = getsockname(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
pasv_ip = (unsigned char *)&f_datasvr.sin_addr;
pasv_port = (unsigned char *)&f_datasvr.sin_port;
rc = uftt_cmd(dat_buffer, cmd_sock,"PORT %d,%d,%d,%d,%d,%d",pasv_ip[0],
pasv_ip[1], pasv_ip[2], pasv_ip[3], pasv_port[0], pasv_port[1]);
if (rc == 200)
printf("-6- %d OK\n", rc);
else
printf("-6- %d ERR\n", rc);
/* get RETR put STOR append APPE */
if (ft_flg == 0) {
rc = uftt_cmd(dat_buffer, cmd_sock, "STOR %s", ft_obj);
}
else if (ft_flg > 0){
rc = uftt_cmd(dat_buffer, cmd_sock, "APPE %s", ft_obj);
}
if (rc == 150)
printf("-7- %d OK\n", rc);
else
printf("-7- %d ERR\n", rc);
stream_sock = accept(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
if (stream_sock < 0)
err_sys("--- stream socket error");
rc_size = f_put_file(stream_sock, ft_src, ft_obj, ft_flg, file_size);
/* do without ***
rc = uftt_cmd(dat_buffer, dat_sock,"QUIT");
printf("-8- %d \n", rc);
*/
close(stream_sock);
close(dat_sock);
rc = uftt_cmd(dat_buffer, cmd_sock,"QUIT");
if (rc == 226)
printf("-9- %d OK\n", rc);
else
printf("-9- %d ERR\n", rc);
close(cmd_sock);
return rc_size ;
}
C. Auto CAD,哪有免费下载,我找了好多个,都不行了.急
AutoCAD的二次开发主要涉及以下内容:(1)编写各种用户自定义函数并形成若干LISP、ARX、VLX或ADS文件,以及一些DCL文件。(2)建立符合自己要求的菜单文件,一般可在AutoCAD原菜单文件内添加自己的内容,对于AutoCAD2000版本还可增加部分菜单文件,然后经交互方式加入到系统中去。(3)在系统的ACAD.LSP或类似文件中加入某些内容以便进行各种初始化操作,如在启动时立即装入一些文件等。(4)通过系统对话框设置某些路径。这些操作在程序开发成功后向其它AutoCAD系统上安装应用,特别是需要大批安装时,需要进行很多文件检索、内容增删、子目录创建、文件拷贝、系统设置等繁琐工作,如能令上述工作全部自动进行,使整个二次开发程序在无人干预的情况下嵌入系统,将大大提高工作效率。
AutoCAD荣登全球绘图软件的龙头宝座,主要是因为它具有开放的体系结构。它允许用户和开发者采用高级编程语言对其进行扩充和修改,即二次开发,能最大限度地满足用户的特殊要求。AutoCAD第一版于1982年11月由AutoDESK公司推出,目前大家广泛使用的是AutoCAD 2000或2002,最新版本是AutoCAD 2004,其二次开发语言及工具也在不断地涌现
1 AutoLISP
AutoLISP的全名是LIST Processing Language,她出现于1985年推出的AutoCAD R2.18中,是一种嵌入在AutoCAD内部的编程语言,是LISP原版的一个子集,她一直是低版本AutoCAD的首选编程语言。它是一种表处理语言,是被解释执行的,任何一个语句键入后就能马上执行,它对于交互式的程序开发非常方便。其缺点是继承了LISP语言的编程规则而导致繁多的括号。
3 ADS
ADS的全名是AutoCAD Development System,它是AutoCAD的C语言开发系统,ADS本质上是一组可以用C语言编写AutoCAD应用程序的头文件和目标库,它直接利用用户熟悉的各种流行的C语言编译器,将应用程序编译成可执行的文件在AutoCAD环境下运行,这种可以在AutoCAD环境中直接运行的可执行文件叫做ADS应用程序。ADS由于其速度快,又采用结构化的编程体系,因而很适合于高强度的数据处理,如二次开发的机械设计CAD、工程分析CAD、建筑结构CAD、土木工程CAD、化学工程CAD、电气工程CAD等。
4 ObjectARX
ObjectARX是一种崭新的开发AutoCAD应用程序的工具,她以C++为编程语言,采用先进的面向对象的编程原理,提供可与AutoCAD直接交互的开发环境,能使用户方便快捷地开发出高效简洁的Auto CAD应用程序。ObjectARX并没有包含在AutoCAD中,可在AutoDESK公司网站中去下载,其最新版本是ObjectARX for AutoCAD 2000,它能够对AutoCAD的所有事务进行完整的、先进的、面向对象的设计与开发,并且开发的应用程序速度更快、集成度更高、稳定性更强。ObjectARX从本质上讲,是一种特定的C++编程环境,她包括一组动态链接库(DLL),这些库与AutoCAD在同一地址空间运行并能直接利用AutoCAD核心数据结构和代码,库中包含一组通用工具,使得二次开发者可以充分利用AutoCAD的开放结构,直接访问AutoCAD数据库结构、图形系统以及CAD几何造型核心,以便能在运行期间实时扩展AutoCAD的功能,创建能全面享受AutoCAD固有命令的新命令。ObjectARX的核心是两组关键的API,即AcDb(Auto CAD数据库)和AcEd(Auto CAD编译器),另外还有其它的一些重要库组件,如AcRX(Auto CAD实时扩展)、AcGi(Auto CAD图形接口)、AcGe(Auto CAD几何库)、ADSRX(Auto CAD开发系统实时扩展)。ObjectARX 还可以按需要加载应用程序;使用ObjectARX进行应用开发还可以在同一水平上与Windows系统集成,并与其它Windows应用程序实现交互操作。
5 VisualLISP
VisualLISP已经被完整地集成到AutoCAD 2000中,她为开发者提供了崭新的、增强的集成开发环境,一改过去在AutoCAD中内嵌AtuoLISP运行引擎的机制,这样开发者可以直接使用AutoCAD中的对象和反应器,进行更底层的开发。其特点为自身是AutoCAD 2000中默认的代码编辑工具;用它开发AutoLISP程序的时间被大大地缩短,原始代码能被保密,以防盗版和被更改;能帮助大家使用ActiveX对象及其事件;使用了流行的有色代码编辑器和完善的调试工具,使大家很容易创建和分析LISP程序的运行情况。在VisualLISP中新增了一些函数:如基于AutoLISP的ActiveX/COM自动化操作接口;用于执行基于Auto CAD内部事件的LISP程序的对象反应器;新增了能够对操作系统文件进行操作的函数。
6 VBA
VBA 即Mcrosoft office中的Visual Basic for Applications,它被集成到AutoCAD 2000中。VBA为开发者提供了一种新的选择,也为用户访问AutoCAD 2000中丰富的技术框架打开一条新的通道。VBA和AutoCAD 2000中强大的ActiveX自动化对象模型的结合,代表了一种新型的定制AutoCAD的模式构架。通过VBA,我们可以操作AutoCAD,控制ActiveX和其它一些应用程序,使之相互之间发生互易活动。
D. C语言程序设计题
这有一个例程序,跟你的要求有出入,不过肯定对你有帮助!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define N 100
struct employee//职工基本情况
{
int num;//工号
int position;//职位1为董事长2为总经理3为副总经理等
char name[8];//姓名
char sex[2];//性别f为女m为男
int age;//年龄
int cult;//文化程度1为专家2为博士3为硕士4为学士5为其他
int salary;//工资
int state;//健康情况分为good,general,bad
}em[N];
struct communication//职工通讯录
{
char name[8];
char officetel[13];
char hometel[13];
char handtel[13];
char address[13];
}empc[N];
struct empsalary//职工工资与姓名的文件
{
char name[8];
int salary;
}emps[N];
void manage();
void query();
void communicate();
void input();
void display();
void change();
void del();
void add();
void count();
int changeposition();
int changecult();
int changesalary();
int changestate();
void querysalary();
void creat();
void inputcommunicate();
void querycommunicate();
void changecommunicate();
void changetel1();
void changetel2();
void changetel3();
char password[7]="123456";
void main()
{
int choice;
char s[7];
int flag=0;
int n=3;
do
{
printf("棚梁州请你输入密码:\n");
scanf("%s",s);
if(!strcmp(s,password))//若密码正确
{
printf("恭喜你成功登陆了\n\n\n");
flag=1;
break;
}
else
{
printf("输入有错误请重新输入:\n");
n--;
}
}while(n>0);
if(!flag)
{
printf("你的输入次数已到再见\n");
}
do
{
printf("~~~~~~~~~~\t\t\t~~~~~~~~~~~~\n");
printf("\t\渣雀t欢迎进入职工管理系统中文版\n");
printf("制作人:黄仕福\t班级:计081班\t学号:303011608217\n");
printf("联系地址:石家庄经链蔽济学院\n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("\t\t请你选择操作类型:\n");
printf("==============\t\t==============\n");
printf("\t\t1进入管理系统\n");
printf("\t\t2进入查询系统\n");
printf("\t\t3进入通讯录\n");
printf("\t\t0退出系统\n");
printf("==============\t\t==============\n");
printf("说明:版权归作者所有违者必究\n\n\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
manage();
break;
case 2:
query();
break;
case 3:
communicate();
break;
case 0:
{
printf("谢谢使用再见\n");
exit(0);
}
default:
{
printf("输入有错误请重新输入:\n");
return;
}
}
}while(1);
}
void manage()
{
int choicemanage;
char choice='y';
while(choice=='y'||choice=='Y')
{
printf("\t\t欢迎进入管理系统\n");
printf("===================\n");
printf("\t\t请你选择操作类型:\n");
printf("\t\t1输入职工信息\n");
printf("\t\t2显示职工信息\n");
printf("\t\t3修改职工信息\n");
printf("\t\t4追加一个职工信息\n");
printf("\t\t5删除一个职工信息\n");
printf("\t\t6统计职工信息\n");
printf("\t\t0返回\n");
printf("=====================\n");
scanf("%d",&choicemanage);
switch(choicemanage)
{
case 1:
input();//输入职工信息
break;
case 2:
display();//显示职工信息
break;
case 3:
change();//修改职工信息
break;
case 4:
add();//追加一个职工信息
break;
case 5:
del();//删除一个职工信息
break;
case 6:
count();//统计职工信息
break;
case 0:
printf("谢谢你的使用再见\n");
return;
default:
printf("你的输入有错请重新输入\n");
}
printf("是否继续管理?(y/n)");
scanf("%s",&choice);
}
if(toupper(choice)=='N'||(choice)=='n')
{
printf("输入完毕,任意键返回\n");
getch();
return;
}
}
void input()
{
FILE *fp;
int i=0;
char choiceinput='y';
if((fp=fopen("employee.txt","w"))==NULL)
return;
while(choiceinput=='y'||choiceinput=='Y')
{
i++;
printf("第%d个职工\n",i);
printf("\n");
printf("请你输入工号:\n");//输入工号
scanf("%d",&em[i].num);
printf("\n");
printf("请你输入职位:\n");//输入职位
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
scanf("%d",&em[i].position);
printf("\n");
printf("请你输入姓名:\n");//输入姓名
scanf("%s",em[i].name);
printf("\n");
printf("请你输入性别以m为男f为女:\n");//输入性别
scanf("%s",em[i].sex);
printf("\n");
printf("请你输入文化程度:\n");//输入文化程度
printf("1为专家2为博士3为硕士4为学士5为其他\n");
scanf("%d",&em[i].cult);
printf("\n");
printf("请你输入工资:\n");//输入工资
scanf("%d",&em[i].salary);
printf("\n");
printf("请你输入身体情况:\n");//身体情况
printf("1好2为一般3为差\n");
scanf("%d",&em[i].state);
printf("\n");
printf("是否继续输入?(y/n)\n");
scanf("%s",&choiceinput);
fwrite(&em[i],sizeof(struct employee),1,fp);
}
if(toupper(choiceinput)=='N')
{
fclose(fp);
printf("输入完毕,任意键返回\n");
getch();
return;
}
}
void display()//显示职工信息
{
FILE *fp;
int i;
if((fp=fopen("employee.txt","r"))==NULL)
return;
printf("输出结果:\n");
printf("工号 职位 姓名 性别 文化程度 工资 身体情况\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工号%d\n",em[i].num);
printf("职位为%d\n",em[i].position);
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
printf("姓名为%s\n",em[i].name);
printf("性别为%s\n",em[i].sex);
printf("其中m为男f为女\n");
printf("文化程度为%d\n",em[i].cult);
printf("1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d\n",em[i].salary);
printf("身体情况为%d\n",em[i].state);
printf("1好2为一般3为差\n");
}
printf("完毕按任意键返回\n");
getch();
fclose(fp);
return;
}
void change()
{
FILE *fp;
int i;
char chname[8];
int choicechange;
printf("请你输入要修改的人的姓名:\n");
scanf("%s",&chname);
if((fp=fopen("employee.txt","w+"))==NULL)
{
printf("不能够打开这个文件\n");
return;
}
for(i=0;i<N;i++)
{
if(strcmp(chname,em[i].name)==0)
{
printf("这是你要修改的人的信息\n");
printf("工号为%d职位为%d姓名为%s性别为%s文化程度为%d工资为%d身体为%d\n",em[i].num,em[i].position,em[i].name,em[i].sex,em[i].cult,em[i].salary,em[i].state);
printf("------------------------------------------------------------\n");
printf("请你输入要修改的部分:\n");
printf("======================\n");
printf("1修改职位\n");
printf("2修改文化程度\n");
printf("3修改工资\n");
printf("4修改身体情况\n");
printf("0退出系统\n");
printf("======================\n");
printf("请选择\n");
scanf("%d",&choicechange);
switch(choicechange)
{
case 1:
em[i].position=changeposition();
break;
case 2:
em[i].cult=changecult();
break;
case 3:
em[i].salary=changesalary();
break;
case 4:
em[i].state=changestate();
break;
case 0:
return;
default :
printf("输入有错误");
}
fwrite(&em[i],sizeof(struct employee),1,fp);
}
}
fclose(fp);
printf("操作完成按任意键返回\n");
getch();
return;
}
int changeposition()
{
int newposition;
printf("请你输入新职位:\n");
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
scanf("%d",&newposition);
return(newposition);
}
int changecult()
{
int newcult;
printf("请你输入新的文凭:\n");
printf("1为专家2为博士3为硕士4为学士5为其他\n");
scanf("%d",&newcult);
return(newcult);
}
int changesalary()
{
int newsalary;
printf("请你输入新的工资:\n");
scanf("%d",&newsalary);
return(newsalary);
}
int changestate()
{
int newstate;
printf("请你输入现在的身体情况:\n");
printf("1好2为一般3为差\n");
scanf("%d",&newstate);
return(newstate);
}
void add()//追加一个职工信息
{
struct employee emp;
FILE *fp;
int i=0;
if((fp=fopen("employee.txt","ab+"))==NULL)
{
printf("不能够打开这个文件\n");
getch();
return;
}
printf("请你输入新人的内容:\n");
printf("请你输入工号:\n");//输入工号
scanf("%d",&emp.num);
printf("请你输入职位:\n");//输入职位
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
scanf("%d",&emp.position);
printf("请你输入姓名:\n");//输入姓名
scanf("%s",emp.name);
printf("请你输入性别以m为男f为女:\n");//输入性别
scanf("%s",emp.sex);
printf("请你输入文化程度:\n");//输入文化程度
printf("1为专家2为博士3为硕士4为学士5为其他\n");
scanf("%d",&emp.cult);
printf("请你输入工资:\n");//输入工资
scanf("%d",&emp.salary);
printf("请你输入身体情况:\n");//身体情况
printf("1好2为一般3为差\n");
scanf("%d",&emp.state);
fwrite(&emp,sizeof(struct employee),1,fp);
rewind(fp);
printf("插入完毕,按任意键返回\n");
getch();
fclose(fp);
return;
}
void del()//删除一个职工信息
{
int i=0;
char delname[8];
FILE *fp;
if((fp=fopen("employee.txt","w"))==NULL)
{
printf("文件为空,不能够打开\n");
printf("按任意键返回\n");
getch();
return;
}
printf("请你输入要删除的人的姓名:\n");//删除的职工的信息
scanf("%s",delname);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,delname)!=0)
fwrite(&em[i],sizeof(struct employee),1,fp);
}
fclose(fp);
if((fp=fopen("employee.txt","r"))==NULL)//显示新的职工的信息
return;
printf("新的职工的信息为:\n");
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
printf("工号%d",em[i].num);
printf("职位为%d",em[i].position);
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
printf("姓名为%s",em[i].name[8]);
printf("性别为%s",em[i].sex[2]);
printf("其中m为男f为女");
printf("文化程度为%d",em[i].cult);
printf("1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d",em[i].salary);
printf("身体情况为%d",em[i].state);
printf("1好2为一般3为差\n");
fclose(fp);
}
}
void count()
{
FILE *fp;
int i=0;
int num=0;//总人数统计
int mnum=0,fnum=0;//性别人数统计
int expernum=0,doctornum=0,masternum=0,bechelornum=0,othernum=0;//学位人数统计
int dsznum=0,zglnum=0,fzglnum=0,glnum=0,fglnum=0;//职位人数统计
int mishunum=0,jsynum=0,lbnum=0,ygnum=0;
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能够打开这个文件\n");
printf("按任意键继续\n");
getch();
return;
}
do
{
fread(&em[i],sizeof(struct employee),1,fp);
if(feof(fp))
break;
num++;
if(strcmp(em[i].sex,"m")==0)
mnum++;
if(strcmp(em[i].sex,"f")==0)
fnum++;
if(em[i].cult==1)
expernum++;
if(em[i].cult==2)
doctornum++;
if(em[i].cult==3)
masternum++;
if(em[i].cult=4)
bechelornum++;
if(em[i].cult=5)
othernum++;
if(em[i].position==1)//职位统计
dsznum++;
if(em[i].position==2)
zglnum++;
if(em[i].position==3)
fzglnum++;
if(em[i].position==4)
glnum++;
if(em[i].position==5)
fglnum++;
if(em[i].position==6)
mishunum++;
if(em[i].position==7)
jsynum++;
if(em[i].position==8)
lbnum++;
if(em[i].position==9)
ygnum++;
i++;
}while(1);
printf("总人数为%d\n",num);
printf("====性别分类=====\n");
printf("男人数为%d\n",mnum);
printf("女人数为%d\n",fnum);
printf("=====文凭分类=====\n");
printf("专家数为%d\n",expernum);
printf("博士数为%d\n",doctornum);
printf("硕士数为%d\n",masternum);
printf("学士数为%d\n",bechelornum);
printf("其他的数为%d\n",othernum);
printf("=====职位分类========\n");
printf("董事长数为%d\n",dsznum);
printf("总经理数为%d\n",zglnum);
printf("副总经理数为%d",fzglnum);
printf("经理数为%d",glnum);
printf("副经理数为%d",fglnum);
printf("秘书数为%d",mishunum);
printf("技术员数为%d",jsynum);
printf("领班人数为%d",lbnum);
printf("员工数为%d",ygnum);
fclose(fp);
return;
}
void query()
{
FILE *fp;
int i=0;
char quename[8];
if((fp=fopen("employee.txt","r"))==NULL)
{
printf("不能够打开文件,按任意键返回\n");
getch();
return;
}
printf("请你输入要查询的人的姓名\n");
scanf("%s",quename);
for(i=0;fread(&em[i],sizeof(struct employee),1,fp)!=0;i++)
{
if(strcmp(em[i].name,quename)==0) /*找到,并显示该职工记录*/
{
printf("\t\t\n查询到的职工号或姓名为的信息如下:\n");
printf("以下是你要查询的人的信息\n");
printf("工号%d",em[i].num);
printf("职位为%d",em[i].position);
printf("\t1为董事长2为总经理3为副总经理\n");
printf("\t4为经理5为副经理6为秘书\n");
printf("\t7为技术员8为领班9为员工\n");
printf("姓名为%s",em[i].name);
printf("性别为%s",em[i].sex);
printf("\t其中m为男f为女");
printf("文化程度为%d",em[i].cult);
printf("\t1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d",em[i].salary);
printf("身体情况为%d",em[i].state);
printf("\n");
printf("查询完毕,按任意键返回\n");
getch();
fclose(fp);
return;
}
}
printf("没有这样的人,按任意键返回\n");
getch();
fclose(fp);
return;
}
void querysalary()
{
int i;
FILE *fp1,*fp2;
creat();
if((fp1=fopen("employee.txt","w+"))==NULL)
return;
for(i=0;fread(&em[i],sizeof(struct employee),1,fp1)!=0;i++)
{
printf("输出结果为:\n");
printf("工号%d",em[i].num);
printf("职位为%d",em[i].position);
printf("1为董事长2为总经理3为副总经理\n");
printf("4为经理5为副经理6为秘书\n");
printf("7为技术员8为领班9为员工\n");
printf("姓名为%s",em[i].name[8]);
printf("性别为%s",em[i].sex[2]);
printf("其中m为男f为女");
printf("文化程度为%d",em[i].cult);
printf("1为专家2为博士3为硕士4为学士5为其他\n");
printf("工资为%d",em[i].salary);
printf("身体情况为%d",em[i].state);
printf("1好2为一般3为差\n");
strcpy(emps[i].name,em[i].name);
emps[i].salary=em[i].salary;
}
if((fp2=fopen("empsalary.txt","w"))==NULL)
return;
for(i=0;i<N;i++)
fwrite(&emps[i],sizeof(struct empsalary),1,fp2);
fclose(fp1);
fclose(fp2);
}
void creat()
{
FILE *fp;
if((fp=fopen("employee.txt","w+"))==NULL)
return;
input();
fclose(fp);
}
void communicate()
{
int choicecommunicate;
printf("欢迎进入通讯录系统\n");
printf("请你选择操作类型:\n");
printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
printf("1为输入通讯录信息\n");
printf("2为查询通讯录信息\n");
printf("3为修改通讯录信息\n");
printf("0为退出通讯录系统\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
scanf("%d",&choicecommunicate);
switch(choicecommunicate)
{
case 1:
inputcommunicate();
break;
case 2:
querycommunicate();
break;
case 3:
changecommunicate();
break;
case 0:
{
printf("谢谢使用再见\n");
printf("按任意键返回\n");
getch();
return;
}
default:
printf("输入有错\n");
}
}
void inputcommunicate()
{
FILE *fp;
int choiceincom='y';
int i=0;
if((fp=fopen("empcom.txt","w"))==NULL)
{
printf("不能够打开文件\n");
printf("任意键返回\n");
getch();
return;
}
printf("请你输入通讯录的信息:\n");
while(choiceincom=='y'||choiceincom=='Y')
{
i++;
printf("第%d个职工\n",i);
printf("请你输入姓名:\n");
scanf("%s",empc[i].name);
printf("请你输入办公室电话号码:\n");
scanf("%s",empc[i].officetel);
printf("请你输入家庭电话号码:\n");
scanf("%s",empc[i].hometel);
printf("请你输入手机号码:\n");
scanf("%s",empc[i].handtel);
printf("请你输入地址:\n");
scanf("%s",empc[i].address);
printf("是否继续输入?(y/n)\n");
choiceincom=getch();
fwrite(&empc[i],sizeof(struct communication),1,fp);
}
if(toupper(choiceincom)=='N')
{
fclose(fp);
printf("输入完毕,任意键返回\n");
return;
}
}
void querycommunicate()
{
FILE *fp;
int i=0;
char qcname[8];
if((fp=fopen("empcom.txt","r"))==NULL)
{
printf("不能够打开文件,按任意键返回\n");
getch();
return;
}
printf("请你输入要查询的人的姓名:\n");
scanf("%s",qcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,qcname)==0)
{
printf("以下为您所要求的信息:\n");
printf("姓名为%s\n",empc[i].name);
printf("办公室电话号码为%s\n",empc[i].officetel);
printf("家庭电话号码为%s\n",empc[i].hometel);
printf("手机号码为%s\n",empc[i].handtel);
printf("家庭地址为%s\n",empc[i].address);
printf("查询完毕,按任意键返回\n");
getch();
fclose(fp);
return;
}
}
printf("没有这样的人,按任意键返回\n");
getch();
fclose(fp);
return;
}
void changecommunicate()
{
FILE *fp;
int i=0;
char chcname[8];
int choicecom;
if((fp=fopen("empcom.txt","w+"))==NULL)
{
printf("打不开文件按任意键返回\n");
getch();
return;
}
printf("请你输入你要修改的人的姓名:\n");
scanf("%s",chcname);
for(i=0;fread(&empc[i],sizeof(struct communication),1,fp)!=0;i++)
{
if(strcmp(empc[i].name,chcname)==0)
{
printf("以下为您所要修改的人的信息:\n");
printf("姓名为%s\n",empc[i].name);
printf("办公室电话号码为%s\n",empc[i].officetel);
printf("家庭电话号码为%s\n",empc[i].hometel);
printf("手机号码为%s\n",empc[i].handtel);
printf("家庭地址为%s\n",empc[i].address);
printf("请你选择要修改的东西:\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf("1修改办公室电话号码\n");
printf("2修改家庭电话号码\n");
printf("3修改手机电话号码\n");
printf("0退出系统\n");
printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
scanf("%d",&choicecom);
switch(choicecom)
{
case 1:
changetel1();
break;
case 2:
changetel2();
break;
case 3:
changetel3();
break;
case 0:
return;
default:
printf("输入有错\n");
}
}
}
}
void changetel1()
{
printf("参照上面有时间再编\n");
}
void changetel2()
{
printf("参照上面有时间再编\n");
}
void changetel3()
{
printf("参照上面有时间再编\n");
}
E. c语言知识
错了,比如 “&”或者“%”。标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数字,但可以是字母或者下划线。例如,正确的标识符:abc,a1,prog_to(摘自网络升备网络)
是滴,正笑尺至少我学的只是目前是这样....(就连 javascript语言里面,你在申明变量时至少写上 var)
是滴...但是必须保举高证先申明 后 使用
是滴
是滴(可参考,http://..com/question/17533722,虽然他是说vb,不过这一点一样吧...)
这个我没懂你是什么意思...字符常量可以参见:http://bbs.chinaunix.net/thread-4090169-1-1.html 中的8楼....
是滴...参见 网络:http://ke..com/link?url=W2V4w4mH_
typedef
外部变量。参见:http://ke..com/link?url=
const 。请注意和static的区别。可参考:http://..com/question/293786823.html