基于MFC对话框的个人通信录系统.docx
- 文档编号:4961149
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:25
- 大小:105.92KB
基于MFC对话框的个人通信录系统.docx
《基于MFC对话框的个人通信录系统.docx》由会员分享,可在线阅读,更多相关《基于MFC对话框的个人通信录系统.docx(25页珍藏版)》请在冰豆网上搜索。
基于MFC对话框的个人通信录系统
1.作业题目
请分别就C和C++中的基本输入输出\文件读写各自的特点和实现方法进行分析和举例说明;完成一个简单的基于MFC对话框的个人通信录系统(界面布局和系统需求自己确定),详细描述你的分析以及实现过程,通讯录的数据写入文件。
2.C语言的输入/输出(文件操作)
2.1C语言的输入/输出
在C语言中,没有专门的输入输出语句,所有输入输出操作都是通过对标准I/Q库函数的调用实现的。
常用的输入输出函数有:
scanf()、printf()、getchar()、putchar()、gets ()、puts(),使用这些函数时需要包含头文件stadio.h。
其中:
scanf()---整型、浮点型、字符串数据的输入函数;
printf()---整型、浮点型、字符串数据的输出函数;
putchar()---字符输出函数;
getchar()---字符输入函数;
gets ()---字符串输入函数;
puts()---字符串输出函数。
2.1.1函数getchar()的简单介绍及实现方法
它的功能是从键盘上输入1个字符,其一般形式为:
getchar();通常把输入的字符赋予一个字符变量,构成赋值语句。
使用getchar函数时还应注意:
getchar函数只能接受单个字符,输入多于一个字符时,只接受第一个字符。
例2-1输入单个字符
#include
intmain(void )
{
charc;
printf(“inputacharacter\n”);
c=getchar();
putchar(c);
return0;
}
注意:
程序最后两行可用下面两行的任意一行代替:
putchar(getchar());
printf(“%c”,getchar());
2.1.2函数printf()的简单介绍及实现方法
函数原型:
intprintf(constchar*,
)
参数说明:
format确定输出格式的格式字符串;
为n个表达式。
功能说明:
把表达式
的值按格式字符串中的第
个格式指示转换为外部形式的数据(一串字符),用以取代格式字符串中的第
个格式指示(格式指示符如表2-1所示),若输出的是整型数据,
可整型变量、整型数组元素或常型变量。
向标准输出设备输出所有转换完成后的格式字符串。
输出整数时,格式字符标志为:
“%d”(int型十进制整数),“%u”(unsigned型十进制整数),“%ld”(long型十进制整数)。
表2-1C语言中的实数
类型说明符
字节数
有效数字
数的范围
float
32(4)
6~7
~
double
64(8)
15~16
~
longdouble
128(16)
18~19
~
例2-2printf()格式化输出。
intmain(void)
{
inta=15;
floatb=123.1234567;
doublec=12345678.1234567;
chard=‘p’;
printf(“a=%d,%5d,%o,%x\n”,a,a,a,a);
//要求以4种格式输出整型变量a的值,输出宽度为5
printf(“b=%f,%lf,%5.4lf,%e\n”,b,b,b,b,);
//要求以4种格式输出实型变量b的值,输出宽度为5,精度为4
printf(“c=%lf,%f,%8.4lf\n”,c,c,c);
printf(“d=%c,%8c\n”,d,d);
return0:
}
2.2C语言的文件操作
在C语言中,文件操作都是由库函数来完成的。
文件指针在C语言中用一个指针变量指向一个文件, 这个指针称为文件指针。
通过文件指针就可对它所指的文件进行打开、关闭、读、写、定位等各种操作。
2.2.1文件的打开与关闭
fopen函数用来打开一个文件,其调用的一般形式为:
文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。
“使用文件方式”是指文件的类型和操作要求。
“文件名”是字符串常量或字符串数组。
例如:
FILE *fp;
fp=("file a","r");
其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。
在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。
在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。
因此常用以下程序段打开文件:
if((fp=fopen("c:
\\hzk16","rb")==NULL)
{
printf("\nerror on open c:
\\hzk16 file!
");
getch();
exit
(1);
}
文件一旦使用完毕,应用关闭文件函数把文件关闭,以防意外操作导致数据丢失或被非法篡改。
关闭文件的实质是取消系统与正在操作的文件之间的关联,关闭文件操作由标准库函数fclose()实现,其一般形式为:
fclose(文件指针);
例如:
fclose(fp);
正常完成关闭文件操作时,fclose函数返回值为0。
如返回非零值则表示有错误发生。
编译时通常用下列语句判断文件是否正常关闭:
if(fclose(fp)){
printf(“can’tclosethefile!
\n)”;
exit
(1);
}
2.2.2文件的读写
在C语言中提供了多种文件读写的函数:
字符读写函数 :
fgetc和fputc
字符串读写函数:
fgets和fputs
数据块读写函数:
freed和fwrite
格式化读写函数:
fscanf和fprinf
使用以上函数都要求包含头文件stdio.h。
字符读写函数:
fgetc和fputc是以字符
(字节)为单位的读写函数。
每次可从文件读出或向文件写入一个字符。
下面以一个复制文件的例子简单介绍C语言文本文件读写的特点。
例2-3打开现存文件f1.txt和新建的文件f2.bak,并读取f1.txt中的字符,写到f1.bak中,直至读到f1.txt文件末尾。
该例实现的算法流程图如图2-1所示。
图2-1文件复制流程图
在这里,将用到两个函数:
fgetc()和fputc(),fgetc()函数的原型在stdio.h
中申明如下:
intfgetc(FILE*stream);
其调用方式如下:
ch=fgetc(fp);
ch为字符型变量,fp为文件型指针变量。
函数fgetc()从文件中读取1个字符赋值给ch,fgetc()在读取字符过程中,如果遇到文件结束符,函数将返回文件结束标志EOF(在stdio.h中EOF的值定义为-1)。
如需要在屏幕上显示一个文本文件,可以用以下语句实现:
ch=fgetc(fp);
while(ch!
=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fputc()函数的原型在stdio.h中申明如下:
intfputc(charch,FILE*stream);
ch为字符型变量或字符型常量,fp为文件型指针变量。
函数fputc()将ch的值输出
到fp指针指向的文件中,如果输出成功,函数返回ch的内容,否则返回EOF。
程序实现如下:
#include
#include
intmain(void)
{
FILE*fp1,*fp2;
charch;
if(fp1=fopen((“f1.txt”,“r”))==NULL)
{
printf(“cannotopenf1.txt\n”);
exit
(1);
}
if((fp2=fopen(“f1.bak”,“w”))==NULL)
{
printf(“cannotopenf2.bak\n”);
exit
(1);
}
While((ch=fgetc(fp1))!
=EOF)
fputc(ch,fp2);
fclose(fp1);
fclose(fp1);
}
3.C++输入输出(文件操作)
程序在执行期间,接受外部信息的操作称为程序的输入;而把程序向外部发送信息的操作称为程序的输出。
在C++中没有专门的输入输出语句,所有输入输出是通过输入输出流来实现的。
接下来会简单介绍输入输出数据方法。
准输入输出流库函数iostream常用的输入和输出函数为cin和cout。
在使用C++输入输出流之前,必须在程序的开头增加一行:
#include
3.1C++输入输出
3.1.1输入语句:
cin
语法:
cin>>变量>>变量>>变量
,提取运算符:
“>>”。
cin可以输入任何类型的变量。
从键盘输入数据时,相应位置上的值必须符合变量的类型。
若输入的类型不致,则输入的数据不正确。
例3-1
inti,j;
floatx,y;
cin>>i>>j>>x>>y;
当输入:
2722771.2321.30时,变量值为i=27j=227x=71.23y=21.3。
(1)字符变量输入
为字符变量输入数据时,输入的数据必须是字符型数据。
设有如下的程序片段:
例3-2
charc1,c2,c3,c4;
cin >> c1 >> c2 >> c3;
cin >> c4;
当输入abcd或者abcd时,变量值为 c1=‘a’c2=‘b’c3=‘c’ c4=‘d’。
若要把从键盘上输入的每一个字符,包括空格和回车键都作为一个输入字符赋给字符型变量时,必须使用函数cin.get()。
其格式为:
cin.get(<字符变量>)。
例3-3
charc1,c2,c3,c4;
cin.get(c1);
cin.get(c2);
cin.get(c3);
cin.get(c4);
执行到既定行数时,若输入:
CD,字符C前没有空格,在字符C与D之间有一个空格;则将字符C、空格、D分别赋给c1,c2,c3,该行中的回车键赋给变量c4,若用cin>>c4代替cin.get(c4),则输入行的回车键不起作用,等待用户输入一个字符。
若此处没有cin.get(c4),则回车键保留。
(2)输入十六进制或八进制数据
对于整型变量,从键盘上输入的数据也可以是八进制或十六进制数据。
在缺省的情况下,系统约定输入的整型数是十进制数据。
当要求按八进制或十六进制输入数据时,在cin中必须指明相应的数据类型:
hex为十六进制;oct为八进制;dec为十进制。
格式:
cin>>hex>>整型变量;(输入十六进制整数)
cin>>oct>>整型变量;(输入八进制整数)
cin>>dec>>整型变量;(输入十进制整数)
八进制或十六进制数的输入,只适用于整型变量,不适用于字符型变量,实型变量。
当在cin中指明使用的数制输入后,则所指明的数制一直有效。
如例3-1中,输入的k值不变时,仍为八进制。
输入数据的格式、个数和类型必须与cin中所列举的变量类型一一对应。
例3-4当语句执行到cin时,若输入的数据为:
11111111
179911。
(11111111)
(179911)
3.1.2输出:
cout
和cin流输出相同,cout在进行数据输入时,不管采用何种数据类型,其格式都相同。
cout语句的语法格式:
cout<<表达式<<表达式<<表达式
,插入运算符:
“<<”,这里的表达式的结果可以是任何类型。
如cout<<“字符串”<<变量1<<“字符串”<<变量2
。
(1)输出宽度定位函数setw()。
表达形式:
cout< 当n小于实际数据的长度,按实际数据的长度输出;当n大于实际数据的长度,按右对齐原则输出。 (2)输出十六进制或八进制数据 输出十六进制或八进制数据的格式与输入格式有着极度相似的地方,具体如下: cout< cout< cout< 对于整型数据可指定以八进制或十六进制输出,而对于实型数据可指定以科学表示法形式输出。 例3-5设有如下程序 #include void main(void) { int i=2,j=10,k=20,m=30; float x=3.14,y=100; cout <<"i="< cout.setf(ios: : scientific,ios: : floatfield); cout << oct< cout << x<<'\t'; cout < } 执行程序后的输出为: i=2j=a 与cin中类同,当在cout中指明以一种进制输出整数时,对其后的输出均有效,直到指明又以另一种进制输出整型数据为止。 对实数的输出,也是这样,一旦指明按科学表示法输出实数,则按着的输出均按科学表示法输出,直到指明以定点数输出为止。 3.2C++文件操作 在C++中,对文件的操作是通过stream的子类fstream(filestream)来实现的, 所以要用这种方式操作文件,就必须加入头文件fstream.h。 3.2.1打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: voidopen(constchar*filename,intmode,intaccess);fstream有和open()一样的构造函数, 可以在定义的时侯就打开文件。 fstream有两个子类: ifstream(默认以输入方式打开文件)和ofstream(默认以输出方式打开文件)。 例3-6下面是一个从文件中读入数据的完整程序 #include #include #include intmain(){ charbuffer[256]; ifstreamexamplefile("example.txt"); if(! examplefile.is_open()) { cout<<"Erroropeningfile"; exit (1); } while(! examplefile.eof()) { examplefile.getline(buffer,100); cout< } return0; } 上面的例子读入一个文本文件的内容,然后将它打印到屏幕上。 注意我们使用了一个新的成员函数叫做eof,它是ifstream从类ios中继承过来的,当到达文件末尾时返回true。 3.2.2关闭文件 打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如: file1.close();就把file1相连的文件关闭。 3.2.3读写文件 读写文件分为文本文件和二进制文件的读取。 对于文本文件的读取,用插入器(<<)向文件输出,用析取器(>>)从文件输入,相对比较简单。 此处着重介绍二进制文件的读写。 ①put() put()函数向流写入一个字符,其原型是ofstream&put(charch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。 ②get() get()函数比较灵活,有3种常用的重载形式: 一种就是和put()对应的形式,功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符;另一种重载形式的原型是: intget();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();还有一种形式的原型是: ifstream&get(char*buf,intnum,chardelim='\n'); 这种形式把字符读入由buf指向的数组,直到读入了num个字符或遇到了由delim指定的字符,如果没使用delim这个参数,将使用缺省值换行符'\n'。 ③读写数据块 要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下: read(unsignedchar*buf,intnum); write(constunsignedchar*buf,intnum); 3.3C与C++输入输出、文件读写的比较。 由于C++是在C语言的基础上发展扩充而来的,它当然支持C语言中的输入输出函数。 使用C语言的输入输出函数时,要包含相应的头文件。 使用C++编程时,我们提倡使用C++提供的输入输出流来实现输入输出,最好不要使用C语言的输入输出函数来实现输入输出。 因为同时使用C++的输入输出流和C语言的输入输出函数来完成输入输出时,有时会出现一些特殊异常的现象,如输入输出语句的执行顺序不对等。 和C的文件操作方式不同的是,C++I/O系统管理两个与一个文件相联系的指针。 一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。 每次执行输入或输出时,相应的指针自动变化。 所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是seekg()和seekp(),seekg()是设置读位置,seekp是设置写位置。 它们最通用的形式如下: istream&seekg(streamoffoffset,seek_dirorigin); ostream&seekp(streamoffoffset,seek_dirorigin); streamoff定义于iostream.h中,定义有偏移量offset所能取得的最大值,seek_dir表示移动的基准位置,是一个有以下值的枚举: ios: : beg: 文件开头 ios: : cur: 文件当前位置 ios: : end: 文件结尾 这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。 比如下面: file1.seekg(1234,ios: : cur);//把文件的读指针从当前位置向后移1234个字节 file2.seekp(1234,ios: : beg);//把文件的写指针从文件开头向后移1234个字节 4.基于MFC的简易通讯录管理系统设计 4.1MFC简单概述 MFC是对WindowsAPI的封装,它包含两个最重要的类: CWinApp和CFrameWnd。 CWinApp代表着程序的本体,winmain函数就是封装在其中,所以函数将从这个类中开始运行;CFrameWnd代表了一个主框窗口: 在编写函数的时候需要以这两个类为基础进行派生自己的类,并改写其一些成员函数以实现自己的程序的功能。 4.1.1MFC是一个编程框架 MFC中的各种类结合起来构成了一个应用程序框架,它的目的是让程序员在此基础上来建立Windows下的应用程序,这是一种相对于SDK来说更为简单的方法。 因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。 在提供了相应的工具的MicrosoftVisualC++中,编译后,就通过类库是限量应用程序特定的逻辑。 4.1.2封装 构成MFC框架的是MFC类库,MFC类库是C++类型。 这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能。 4.1.3继承 首先,MFC抽象出众多类的共同性,设计出一些基类作为实现其他类的基础。 这些类中,最重要的是CObject和CCmdTarget。 CObject是MFC的根类,绝大部分MFC类是其派生的,CObject实现了一些重要的特性,包括动态信息、动态创建、对象序列化、对程序调试的支持等,所以从CObject派生的类都具备或者可以具备它所拥有的特性。 CCmdTarget通过封装一些属性和方法,提供了信息处理的框架。 MFC中,任何可以处理消息的类都从CCmdTarget派生。 4.1.4虚拟函数和动态约束 MFC以“C++”为基础,支持虚拟函数和动态约束,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数。 这样,通过虚拟函数和消息映射,MFC类提供了丰富的编译窗口。 程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编译框架中,MFC编译框架将在适当的时候、地方来调用程序的代码。 4.2功能模块框图 根据系统功能的要求,可以将系统分解成几个功能模块,它如图4-1所示。 图4-1通讯录管理系统模块图 4.3程序代码编写 本程序采用的是MFC的基于窗体的基本架构。 实现程序中主要逻辑和文件访问功能的函数被封装在一个自己写的类“myClass”中。 (1)头文件(myClass.h)中的代码如下: classmyClass { public: myClass(void);//构造函数。 ~myClass(void);//析构函数。 CStringgetAll();//得到全部联系人的信息。 CStringgetFriend();//得到标记为“朋友”的联系人的信息。 CStringgetFamily();//得到标记为“家人”的联系人的信息。 CStringgetOthers();//得到标记为“其他”的联系人的信息。 voidadd(CStringstr);//添加一条记录。 }; (2)定义文档类数据成员 在CAboutDlg对话框中编写代码: classCAboutDlg: publicCDialogEx { public: CAboutDlg(); //对话框数据 enum{IDD=IDD_ABOUTBOX}; protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持 //实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg: : CAboutDlg(): CDialogEx(CAboutDlg: : IDD) { } voidCAboutDlg: : DoDataExchange(CDataExchange*pDX) { CDialogEx: : DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg,CDialogEx) END_MESSAGE_MAP() } (4)添加记录 voidaddConnect: : DoDataExchan
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MFC 对话框 个人 通信 系统