三内存管理应用程序设计

上传人:沈*** 文档编号:172675108 上传时间:2022-12-05 格式:PPT 页数:116 大小:1.04MB
收藏 版权申诉 举报 下载
三内存管理应用程序设计_第1页
第1页 / 共116页
三内存管理应用程序设计_第2页
第2页 / 共116页
三内存管理应用程序设计_第3页
第3页 / 共116页
资源描述:

《三内存管理应用程序设计》由会员分享,可在线阅读,更多相关《三内存管理应用程序设计(116页珍藏版)》请在装配图网上搜索。

1、下一页第第3 3章(二)章(二)主讲:刘志强主讲:刘志强操作系统及程序设计操作系统及程序设计下一页上一页停止放映第第 2/76 页页三、三、内存管理应用程序设计l内存管理的相关概念内存管理的相关概念l内存数据空间的动态分配内存数据空间的动态分配l内存代码空间的动态分配内存代码空间的动态分配下一页上一页停止放映第第 3/76 页页 1内存管理 l主要任务主要任务对内存储器进行分配、变换、保护和扩充,存储管理还应该能够在内存和外存之间交换数据和代码。在Windows操作系统下,存储器被保护起来,程序和用户无法直接访问,需要在程序中通过静态和动态两种方式来访问。Windows的内存管理完成物理内存和

2、虚拟内存之间的交换,虚拟内存是32位的,多达4GB的大小,内存管理还提供了一个核心服务,完成内存映射文件、写时复制内存和用户程序使用的大量和稀疏内存的管理。下一页上一页停止放映第第 4/76 页页两种使用内存的基本方法l静态方法数组,例如 Student student501l动态方法指针,例如Student*student=new Studentcount+1下一页上一页停止放映第第 5/76 页页Windows NT 内存管理Windows可以管理4GB大小的空间;操作系统使用其中2GB空间,每个用户进程可以使用2GB的专用地址空间。Win32 API提供:VirtualXXX形式的以页为

3、单位的虚拟内存函数;CreateMapFile、MapViewofFile内存映射文件函数;HeapXXX堆栈函数。下一页上一页停止放映第第 6/76 页页内存管理 Windows NTWindows NT在在X86X86体系下虚拟地址空间的分布:体系下虚拟地址空间的分布:下一页上一页停止放映第第 7/76 页页例例3-6 动态申请虚拟内存动态申请虚拟内存l整数阶乘计算到13就会出错。怎么办?l使用动态申请的虚拟内存空间编写计算任何数的阶乘的程序。解体思路:计算较大数的阶乘的计算一般使用数组来存放阶乘的位数。但是C+中数组最大长度是10万,这将影响使用的范围。可以通过使用动态内存分配(指针)来

4、解决。本程序采用动态申请虚拟内存空间的方法,不使用物理内存,而是使用虚拟内存,从而使求解问题的范围扩大。阶乘源代码阶乘执行代码下一页上一页停止放映第第 8/76 页页程序算法程序算法 从命令行接收输入并使用strtol函数将其转换为long型的整数(n为要求阶乘的数)。通过函数VirtualAlloc保留n10240的地址空间,申请n1024的地址空间。调用计算阶乘函数lfac。一位一位显示阶乘结果。通过函数VirtulFree释放虚拟内存。下一页上一页停止放映第第 9/76 页页函数VirtualAlloc用函数VirtualAlloc保留或申请虚拟内存空间。该函数格式如下该函数格式如下:L

5、PVOID VirtualAlloc(LPVOID lpAddress,/起始地址起始地址 DWORD dwSize,/大小大小 DWORD flAllocationType,/分配类型(分配类型(MEM_COMMIT等)等)DWORD flProtect /保权限保权限(PAGE_READWRITE等)等));下一页上一页停止放映第第 10/76 页页函数VirtualFree使用函数VirtualFree释放虚拟内存,函数格式:BOOL VirtualFree(LPVOID lpAddress,/起始地址 DWORD dwSize,/大小 DWORD dwFreeType /释放类型(ME

6、M_RELEASE等));下一页上一页停止放映第第 11/76 页页源程序#include#include int lfac(int*a,int n)int sum,sc;for(int i=0;in*1024;i+)/空间清零ai=0;a0=1;/最低位设为1 for(i=2;i=n;i+)/n的阶乘的循环 sc=0;for(int j=0;j0)return-1;else return 0;下一页上一页停止放映第第 12/76 页页举例求举例求5!a0=1;/最低位设为1for(i=2;i=n;i+)/n的阶乘的循环 sc=0;for(int j=0;jn*1024;j+)/阶乘每一位处理

7、的循环 sum=aj*i+sc;/上一次进位值和当前计算结果求和 sc=sum/10;/存放进位数值 aj=sum%10;/将余数存入数组 i=2(2!=2)i=3(3!=6)i=4(4!=24)i=5(5!=120)j=0sum=2sc=0a0=22!=a0=2j=0sum=6sc=0a0=63!=a0=6j=0sum=24sc=2a0=4j=0sum=20sc=2a0=0j=2sum=20sc=0a2=1j=1sum=2sc=2a1=23!=a1a0=24j=1sum=12sc=1a1=26!=a2a1a0=120下一页上一页停止放映第第 13/76 页页主函数int main()char

8、*p;int n;coutn;if(n0)couta输入数据错;return 1;int*lpBase=(int*)VirtualAlloc(NULL,1024,MEM_COMMIT,PAGE_READWRITE);/保留 n*10240总的地址空间 int*lpPage=(int*)VirtualAlloc(lpBase+0,n*1024,MEM_COMMIT,PAGE_READWRITE);/提交n*1024的页地址空间 bool flag=FALSE;if(lfac(lpPage,n)0)cout溢出=0;i-)if(flag|lpPagei0)flag=TRUE;coutlpPagei

9、;/输出每一位 coutendl;VirtualFree(int*)lpPage+0,n*1024,MEM_DECOMMIT);/对页地址解除提交内存VirtualFree(lpBase,n*10240,MEM_RELEASE);/释放整个范围的地址return 0;例3-6源代码例3-6执行代码下一页上一页停止放映第第 14/76 页页程序执行结果程序执行结果下一页上一页停止放映第第 15/76 页页 2 动态连接库的使用 动态链接库动态链接库(Dynamic-Link Library),简称),简称DLL,是基,是基于于Windows程序设计的一个重要组成部分。程序设计的一个重要组成部分。

10、优点:优点:1使用使用DLL的动态连接不是将库代码拷贝,只在程序中记录的动态连接不是将库代码拷贝,只在程序中记录函数的入口点和接口,在程序执行时才将库代码装入内存,函数的入口点和接口,在程序执行时才将库代码装入内存,如果有多个程序使用相同的如果有多个程序使用相同的DLL,也只需将,也只需将DLL在内存中装在内存中装载一次,节省了内存开销。载一次,节省了内存开销。2DLL是基于是基于Windows的程序模块,它不仅包含可执行代码,的程序模块,它不仅包含可执行代码,还可以包含数据,各种资源,扩大了库文件的使用范围。还可以包含数据,各种资源,扩大了库文件的使用范围。3对于一个大型的、不断更新的应用程

11、序,可以将许多重复对于一个大型的、不断更新的应用程序,可以将许多重复的功能写成的功能写成DLL,用主程序调用,这样既减少了开发的工作,用主程序调用,这样既减少了开发的工作量,又提高了访问速度。量,又提高了访问速度。4DLL独立于编程语言,可以使用目前流行的多种计算机语独立于编程语言,可以使用目前流行的多种计算机语言或开发工具来编制和调用,比如:言或开发工具来编制和调用,比如:VC+、C+Builder、PB、VB、Delphi和汇编语言等。和汇编语言等。下一页上一页停止放映第第 16/76 页页例例3-7 3-7 编写计算圆周率的程序编写计算圆周率的程序解题思路解题思路o 已经提供可以计算任意

12、位小数的圆周率的动态链接库文件“pi.dll”和静态库文件“pi.lib”,需要将它们拷贝到工程的“Debug”子目录中。o 在“pi.dll”中存在计算圆周率的函数ComputPI,格式如下:int ComputPI(long bits);o 其中,参数bits代表要求的圆周率的小数位数;返回值是0表示成功,是1表示失败。下一页上一页停止放映第第 17/76 页页程序步骤程序步骤 建立“Win32控制台工程”,工程名称为“Example3_7”;在工程中添加一个C+源程序文件,文件名称为“Example3_7.cpp”;在工程中加入文件“pi.lib”。下一页上一页停止放映第第 18/76

13、页页源程序源程序#include iostream.h#include#include#include int ComputPI(longint ComputPI(long bits);bits);int main(int argc,char int main(int argc,char*argvargv)if(argcif(argc 2)2)cout coutaa使用方法使用方法:Example3_7:Example3_7;return 1;return 1;char char*p;p;long n=strtol(argv1,&p,10);long n=strtol(argv1,&p,10)

14、;/转换为转换为longlong型整数型整数 if(n0)coutif(n0)cout“a“a输入数据错输入数据错”;return 1;return 1;if(ComputPI(n if(ComputPI(n)=1)=1)cout coutaa计算出错数据错计算出错数据错endlendl;return 0;return 0;例3-7源代码例3-7执行代码下一页上一页停止放映第第 19/76 页页程序执行结果程序执行结果下一页上一页停止放映第第 20/76 页页 四、设备与文件管理应用程序设计四、设备与文件管理应用程序设计l设备管理、文件管理于人机接口管理的相关概念l设备管理程序设计l文件设备管

15、理程序设计l人机接口管理程序设计 下一页上一页停止放映第第 21/76 页页 1.设备管理与程序设计设备管理与程序设计l主要任务 根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面,以提高设备与设备之间,设备与之间,进程与进程之间的并行性,从而提高整个操作系统的效率。下一页上一页停止放映第第 22/76 页页设备和内存之间数据传输方式设备和内存之间数据传输方式l操作系统的设备管理程序通过四种控制方式完成设备与内存之间的数据传送。1程序直接控制方式 中断控制方式 DMA方式 通道方式 下一页上一页停止放映第第 23/76 页页(1)循环探测)循环探测I/

16、O方式方式l通过设置一个测试通过设置一个测试I/O设备设备“忙忙/闲闲”状态标志的状态标志的触发器。若它置触发器。若它置“闲闲”,则执行,则执行I/O操作,若它操作,若它置置“忙忙”,则,则CPU不断对它进行监测,直至设不断对它进行监测,直至设备备“闲闲”下来为止。在早期计算机系统中主要下来为止。在早期计算机系统中主要采用这种方式。采用这种方式。l由于由于CPU速度比速度比I/O设备速度高得多,而循环测设备速度高得多,而循环测试试I/O方式使得方式使得CPU与外部设备只能串行工作,与外部设备只能串行工作,因此因此CPU绝大部分时间都处于等待绝大部分时间都处于等待I/O设备完成设备完成的循环测试

17、中,的循环测试中,CPU资源浪费极大。资源浪费极大。优点:优点:管理简单管理简单 缺点:缺点:浪费了浪费了CPU资源资源 下一页上一页停止放映第第 24/76 页页(2)中断处理方式)中断处理方式l为了克服循环测试方式的缺点(为了克服循环测试方式的缺点(CPU必须不断主必须不断主动测试动测试I/O设备是否空闲),引入中断处理技术。设备是否空闲),引入中断处理技术。该方式的核心就是使该方式的核心就是使I/O设备具有主动设备具有主动“汇报汇报”的的能力;每当完成能力;每当完成I/O操作后,便给操作后,便给CPU发一个通告发一个通告信号。只有当信号。只有当CPU接到接到I/O设备中断请求后,才处设备

18、中断请求后,才处理理I/O操作。操作。优点优点:速度快,提高了资源的利用率。速度快,提高了资源的利用率。缺点缺点:I/O操作还依赖于操作还依赖于CPU,如果,如果I/O处理频繁,处理频繁,CPU也将很忙。特别是对字符设备,传送一个字也将很忙。特别是对字符设备,传送一个字符,就要响应一次中断处理;若字符符,就要响应一次中断处理;若字符I/O设备很多、设备很多、传输量很大时,传输量很大时,CPU可能完全陷入可能完全陷入I/O处理中而不处理中而不能自拔。能自拔。示例示例下一页上一页停止放映第第 25/76 页页DMA方式方式(Direct Memory Access)l中断方式只能提高中断方式只能提

19、高CPU的利用率,但在传送数据量大、的利用率,但在传送数据量大、速度高的情况下,其处理效率就不理想了。速度高的情况下,其处理效率就不理想了。l目前在块设备的目前在块设备的I/O系统中,采用系统中,采用DMA方式。它是一种简方式。它是一种简单的通道方式,即在硬件的支持下,通过占用总线控制单的通道方式,即在硬件的支持下,通过占用总线控制权,实现信息交换。这种方法并不中断当前权,实现信息交换。这种方法并不中断当前CPU的工作,的工作,而只是在而只是在CPU暂停的几个周期内由暂停的几个周期内由DMA控制器实现信息控制器实现信息交换。即交换。即DMA为具有部分为具有部分CPU功能的装置。功能的装置。优点

20、:优点:I/O操作处理速度快。操作处理速度快。缺点:缺点:DMA方式只能完成简单的数据传输,不能满足更方式只能完成简单的数据传输,不能满足更复杂的复杂的I/O操作要求,在大、中型计算机系统中,普遍采操作要求,在大、中型计算机系统中,普遍采用用I/O处理机来管理外部设备和主存之间的信息交换。处理机来管理外部设备和主存之间的信息交换。下一页上一页停止放映第第 26/76 页页(4)通道()通道(Channel)方式)方式l要想把要想把CPU从繁忙的杂务中解放出来,必须使从繁忙的杂务中解放出来,必须使I/O设备的管理不再依赖于设备的管理不再依赖于CPU。“通道通道”是是具有相对独立的具有相对独立的I

21、/O处理能力的装置。如大型处理能力的装置。如大型机的前端机,机的前端机,PC机的机的Intel 8090(I/O通道)等。通道)等。在通道方式下,在通道方式下,I/O处理变成了处理机之间的处理变成了处理机之间的通讯问题。通讯问题。l在采用通道方式的在采用通道方式的I/O系统中,系统中,CPU有两个作有两个作用:一是将用:一是将I/O操作任务下达给通道,由通道操作任务下达给通道,由通道代替代替CPU专门处理专门处理I/O工作;二是随时了解通工作;二是随时了解通道、控制器和设备工作的情况。道、控制器和设备工作的情况。下一页上一页停止放映第第 27/76 页页设备管理示意图设备管理示意图 CPUCH

22、1CH2CHnCU1CU2CUmDV1DV2DV3DV4DVkDVk+1通道通道控制器控制器设备设备下一页上一页停止放映第第 28/76 页页缓冲技术与设备分配缓冲技术与设备分配l缓冲技术缓冲技术 单缓冲、双缓冲、多缓冲和单缓冲池单缓冲、双缓冲、多缓冲和单缓冲池 l设备分配设备分配 专门的数据结构专门的数据结构 最佳的设备分配原则和策略最佳的设备分配原则和策略 设备驱动程序设备驱动程序 下一页上一页停止放映第第 29/76 页页例例3-8 光驱管理程序光驱管理程序算法分析算法分析 通过使用媒体控制接口通过使用媒体控制接口(MCI)的的API函数,实函数,实现对光驱的操作。现对光驱的操作。编写命

23、令行式的程序,格式为:编写命令行式的程序,格式为:光驱操作命令光驱操作命令 光驱号光驱号 操作参数操作参数 接收命令行的接收命令行的argv1参数,代表光驱盘符,参数,代表光驱盘符,和和argv2参数,代表操作命令(参数,代表操作命令(O表示打开,表示打开,C表示关闭);表示关闭);根据根据argv2参数的值,分别传递参数的值,分别传递argv1参数参数调用函数调用函数OnCdopen打开光驱和打开光驱和OnCdclose关关闭光驱。闭光驱。下一页上一页停止放映第第 30/76 页页解题思路解题思路使用使用“mmsystem.h”中的媒体控制接口中的媒体控制接口(MCI)API函数;函数;MC

24、I_OPEN_PARMS /打开光驱参数结构体打开光驱参数结构体MCI_STATUS_PARMS /光驱状态参数结构体光驱状态参数结构体ZeroMemory函数函数 /光驱参数赋零,将光驱类型光驱参数赋零,将光驱类型 /参数设为参数设为CD_AUDIOmciSendCommand函数函数 /发送设备打开命令发送设备打开命令根据命令参数打开光驱和关闭光驱根据命令参数打开光驱和关闭光驱最后释放设备存储。最后释放设备存储。下一页上一页停止放映第第 31/76 页页对话框框架程序用到的元素对话框框架程序用到的元素lMCI_OPEN_PARMSMCI_OPEN_PARMS结构体结构体 lMCI_STAT

25、US_PARMSMCI_STATUS_PARMS结构体结构体 lmciSendCommandmciSendCommand函数函数 lZeroMemoryZeroMemory函数函数 下一页上一页停止放映第第 32/76 页页结构体说明结构体说明光驱管理程序光驱管理程序typedef struct tagMCI_OPEN_PARMS /打开光驱参数打开光驱参数 DWORD dwCallback;/MCIDEVICEID wDeviceID;WORD wReserved0;LPCSTR lpstrDeviceType;LPCSTR lpstrElementName;LPCSTR lpstrAlia

26、s;MCI_OPEN_PARMS;typedef struct tag MCI_STATUS_PARMS /光驱状态参数光驱状态参数 DWORD dwCallback;DWORD dwReturn;DWORD dwItem;DWORD dwTrack;MCI_STATUS_PARMS;下一页上一页停止放映第第 33/76 页页设备控制函数说明设备控制函数说明MCIERROR mciSendCommand(/发送打开设备命令发送打开设备命令 MCIDEVICEID IDDevice,/设备标示号设备标示号 UINT uMsg,/命令消息命令消息 DWORD fdwCommand,/命令消息标志命

27、令消息标志 DWORD dwParam /命令消息参数命令消息参数);void ZeroMemory(/初始化数据函数初始化数据函数 PVOID Destination,/填充地址填充地址 DWORD Length /填充字节大小填充字节大小);下一页上一页停止放映第第 34/76 页页源程序源程序#include#include#include /MCI API函数头文件函数头文件#pragma comment(lib,winmm)void CD_OpenCloseDrive(BOOL bOpenDrive,TCHAR cDrive)MCI_OPEN_PARMS op;/光驱打开参数结构光驱

28、打开参数结构MCI_STATUS_PARMS st;/光驱状态参数结构光驱状态参数结构DWORD flags;TCHAR szDriveName4;/光驱盘符变量光驱盘符变量strcpy(szDriveName,X:);:ZeroMemory(&op,sizeof(MCI_OPEN_PARMS);/光驱参数赋值为光驱参数赋值为0op.lpstrDeviceType=(LPCSTR)MCI_DEVTYPE_CD_AUDIO;/光驱类型参数为光驱类型参数为CD_AUDIOif(cDrive 1)szDriveName0=cDrive;op.lpstrElementName=szDriveName;

29、/光驱盘符参数为函数参数光驱盘符参数为函数参数 flags=MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT|MCI_OPEN_SHAREABLE;else flags=MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_SHAREABLE;if(!mciSendCommand(0,MCI_OPEN,flags,(unsigned long)&op)/发送设备打开命令发送设备打开命令st.dwItem=MCI_STATUS_READY;if(bOpenDrive)mciSendCommand(op.wDeviceID,M

30、CI_SET,MCI_SET_DOOR_OPEN,0);/打开光驱打开光驱else mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0);/关闭光驱关闭光驱mciSendCommand(op.wDeviceID,MCI_CLOSE,MCI_WAIT,0);/释放设备存取释放设备存取下一页上一页停止放映第第 35/76 页页子函数源程序子函数源程序void OnCdopen(CStringvoid OnCdopen(CString m_Letter)m_Letter)/打开光驱子函数打开光驱子函数 CStringCString ne

31、w_letter=m_Letter;new_letter=m_Letter;/取得输入光驱盘符取得输入光驱盘符CD_OpenCloseDrive(TRUECD_OpenCloseDrive(TRUE,new_letter0);,new_letter0);/打开指定盘符光驱打开指定盘符光驱m_Letter=;m_Letter=;void OnCdclose(CStringvoid OnCdclose(CString m_Letter)m_Letter)/关闭光驱子函数关闭光驱子函数 CStringCString new_letter=m_Letter;new_letter=m_Letter;/取

32、得输入光驱盘符取得输入光驱盘符CD_OpenCloseDrive(TRUECD_OpenCloseDrive(TRUE,new_letter0);,new_letter0);/关闭指定盘符光驱关闭指定盘符光驱m_Letter=;m_Letter=;下一页上一页停止放映第第 36/76 页页主函数主函数int main(int argc,char*argv)if(argc 3)couta使用方法使用方法:Example3_8 ;return 1;if(argv20=O)OnCdopen(argv1);else OnCdclose(argv1);return 0;例3-8源代码例3-8执行代码下一

33、页上一页停止放映第第 37/76 页页例例3-9 双缓冲显示位图程序双缓冲显示位图程序 l在程序设计中,普通的绘图方法是一个图形在程序设计中,普通的绘图方法是一个图形一个图形地直接绘制到屏幕上,这样做的缺一个图形地直接绘制到屏幕上,这样做的缺点是会引起屏幕闪烁点是会引起屏幕闪烁。l采用双缓冲技术可以减少屏幕的闪烁采用双缓冲技术可以减少屏幕的闪烁。下一页上一页停止放映第第 38/76 页页解题思路解题思路l本程序采用单文档本程序采用单文档/视图框架视图框架;l本程序中定义一个内存显示设备对象本程序中定义一个内存显示设备对象MemDC、屏幕显、屏幕显示设备对象示设备对象pDC和位图对象和位图对象m

34、_Bitmap;l其中其中CBitmap是是MFC提供的一个表示位图文件的位图提供的一个表示位图文件的位图类,一个位图具有它的类型、大小和颜色值等类,一个位图具有它的类型、大小和颜色值等;l通过通过MemDC的函数的函数CreateCompatibleDC建立与屏幕建立与屏幕显示兼容的内存显示设备显示兼容的内存显示设备;l通过通过m_Bitmap的函数的函数CreateCompatibleBitmap建立建立一个与屏幕显示兼容的位图一个与屏幕显示兼容的位图;l通过通过MemDC的函数的函数SelectObject将位图选入到内存显将位图选入到内存显示设备中示设备中;l接着在内存位图中进行绘制接

35、着在内存位图中进行绘制;l绘制完成后通过绘制完成后通过pDC的函数的函数BitBlt将内存中的图拷贝到将内存中的图拷贝到屏幕上进行显示屏幕上进行显示;l使用完成后,需要清除位图对象使用完成后,需要清除位图对象m_Bitmap和内存显示和内存显示设备设备MemDC。下一页上一页停止放映第第 39/76 页页程序步骤程序步骤 建立单文档建立单文档/视图框架程序,工程名为视图框架程序,工程名为“Example3_9”;在文件在文件“Example3_9View.cpp”的的OnDraw(CDC*pDC)函数中添加如下代码:函数中添加如下代码:CDC MemDC;/首先定义一个显示设备对象首先定义一个

36、显示设备对象CBitmap m_Bitmap;/定义一个位图对象定义一个位图对象 int nWidth=500;/绘图宽度绘图宽度int nHeight=500;/绘图高度绘图高度MemDC.CreateCompatibleDC(NULL);/建立与屏幕显示兼容的内存显示设备建立与屏幕显示兼容的内存显示设备m_Bitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);/建立一个与屏幕建立一个与屏幕显示兼容的位图显示兼容的位图MemDC.SelectObject(&m_Bitmap);/将位图选入到内存显示设备中将位图选入到内存显示设备中MemDC.Fi

37、llSolidRect(0,0,nWidth,nHeight,RGB(192,192,192);/画实心矩形画实心矩形 MemDC.Ellipse(100,100,400,400);/画圆画圆MemDC.MoveTo(100,100);/移动到指定位置移动到指定位置MemDC.LineTo(400,400);/画直线画直线MemDC.TextOut(220,250,“欢迎欢迎”);/显示文字显示文字pDC-BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);/将内存中的图拷将内存中的图拷贝到屏幕上进行显示贝到屏幕上进行显示m_Bitmap.DeleteO

38、bject();/清除位图对象清除位图对象MemDC.DeleteDC();/清除内存显示设备清除内存显示设备程序运行即可得到结果程序运行即可得到结果.下一页上一页停止放映第第 40/76 页页程序运行结果程序运行结果 例3-9执行代码下一页上一页停止放映第第 41/76 页页 2.文件管理与程序设计文件管理与程序设计l主要任务主要任务 有效地管理文件的存储空间,合理地组有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访问和文件织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段,并把这保护提供更有效的方法及手段,并把这种存储、检索、共享和保护文件的手段种存储、检索、共享和保

39、护文件的手段提供给操作系统本身和用户,以达到方提供给操作系统本身和用户,以达到方便用户和提高资源利用率的目的。便用户和提高资源利用率的目的。下一页上一页停止放映第第 42/76 页页文件文件有关概念有关概念l文件文件 一组相关信息的集合,文件具有一定的数据结构、一组相关信息的集合,文件具有一定的数据结构、数据、分类属性和访问权限。数据、分类属性和访问权限。文件从物理上,由位(文件从物理上,由位(bit)、字节()、字节(byte)、块)、块(block)、页()、页(page)和盘()和盘(disk)等组成;)等组成;物理结构有连续文件结构、串联文件结构和索引物理结构有连续文件结构、串联文件结

40、构和索引文件结构。文件结构。从逻辑上,有字(从逻辑上,有字(word)、字段()、字段(segment)、)、记录(记录(record)、虚拟块()、虚拟块(virtual block)、文)、文件(件(file)、文件目录()、文件目录(file directory)、文件)、文件夹(夹(folder)和文件卷()和文件卷(volume)等。)等。逻辑结构可分为两大类:字符流式的无结构文件逻辑结构可分为两大类:字符流式的无结构文件和记录式的有结构文件。和记录式的有结构文件。下一页上一页停止放映第第 43/76 页页文件系统文件系统l文件管理程序和所管理的全部文件(文件与目录文件管理程序和所管

41、理的全部文件(文件与目录的集合)。的集合)。l最常用的一些文件类型是:最常用的一些文件类型是:.exe 可执行文件可执行文件 .wav声音文件声音文件.lib静态库文件静态库文件 .jpg 图片文件图片文件.dll动态库文件动态库文件 .doc Word文件文件.ocx 组件文件组件文件 .mdb Access数据库文件数据库文件.cpp C+源程序文件源程序文件 .log日志文件日志文件.java Java源程序文件源程序文件 .bmp 位图文件位图文件.html 网页文件网页文件 .ini初始化文件初始化文件.chk磁盘整理文件等等磁盘整理文件等等下一页上一页停止放映第第 44/76 页页

42、文件保护文件保护l文件的保护可以通过改变文件属性文件的保护可以通过改变文件属性为可读、可写、可执行、隐藏和归为可读、可写、可执行、隐藏和归挡来进行。挡来进行。下一页上一页停止放映第第 45/76 页页文件系统格式文件系统格式lWindows操作系统采用操作系统采用FAT32和和NTFS两种两种文件系统格式:文件系统格式:其中其中FAT32采用采用文件目录表文件目录表(file directory table,FDT)和)和文件分配表文件分配表(file allocate table,FAT)相结合的方式来管理)相结合的方式来管理文件。文件。FAT32的文件分配表是的文件分配表是32位的,增位的

43、,增强了对磁盘的管理能力,减少了磁盘空间强了对磁盘的管理能力,减少了磁盘空间的浪费。的浪费。NTFS采用压缩存储方式,具有文件权限采用压缩存储方式,具有文件权限的管理功能,能够更好地管理文件。的管理功能,能够更好地管理文件。下一页上一页停止放映第第 46/76 页页文件结构文件结构l文件的结构包括文件的结构包括物理结构物理结构和和逻辑结构逻辑结构。l文件的物理结构又称为文件的存储结构,它是文件的物理结构又称为文件的存储结构,它是指文件在外存上的存储组织形式,与存储介质指文件在外存上的存储组织形式,与存储介质的存储性能有关。的存储性能有关。l常用的物理结构有常用的物理结构有连续文件连续文件结构、

44、结构、串联串联文件结文件结构和构和索引索引文件结构。文件的逻辑结构是用户所文件结构。文件的逻辑结构是用户所观察到的文件组织形式,是用户可以直接处理观察到的文件组织形式,是用户可以直接处理的数据及结构,它独立于物理特性,又称为文的数据及结构,它独立于物理特性,又称为文件组织(件组织(FILE ORGANIZATION)。)。l文件的逻辑结构可分为两大类:文件的逻辑结构可分为两大类:字符流式字符流式的无的无结构文件和结构文件和记录式记录式的有结构文件。的有结构文件。下一页上一页停止放映第第 47/76 页页文件的逻辑结构文件的逻辑结构l文件的逻辑结构分为两种形式:文件的逻辑结构分为两种形式:一种是

45、有结构的一种是有结构的记录式文件记录式文件,它由一组相关,它由一组相关记录组成。文件中的记录可按顺序编号为记录记录组成。文件中的记录可按顺序编号为记录1 1、记录记录2 2、记录、记录n n。例如,数据库文件。例如,数据库文件。另一种是无结构的另一种是无结构的流式文件流式文件,它是指由字符,它是指由字符序列集合组成的文件。序列集合组成的文件。例如,一个例如,一个WordWord文件。文件。在在UNIXUNIX中,所有文件都被看作是流式文件,中,所有文件都被看作是流式文件,包括打印机、显示器等包括打印机、显示器等I/OI/O设备。设备。示例示例示例示例下一页上一页停止放映第第 48/76 页页文

46、件的物理结构文件的物理结构l是指文件在存储设备上的存放形式。是指文件在存储设备上的存放形式。l文件在逻辑上是连续的,但在存储设备上存放时却文件在逻辑上是连续的,但在存储设备上存放时却有几种不同形式:有几种不同形式:连续文件连续文件。又称顺序文件。其特点是文件存放在存储设。又称顺序文件。其特点是文件存放在存储设备的相临的物理块中,即连续存放。备的相临的物理块中,即连续存放。串联文件串联文件。又称链表文件。它采用非连续的物理块来存。又称链表文件。它采用非连续的物理块来存放文件信息,将文件的所有物理块串联组成一个链表,放文件信息,将文件的所有物理块串联组成一个链表,块之间通过指针链接。块之间通过指针

47、链接。索引文件索引文件。索引文件要求系统为每一个文件创建一张索。索引文件要求系统为每一个文件创建一张索引表,索引表的表项给出文件的逻辑块号和物理块号的引表,索引表的表项给出文件的逻辑块号和物理块号的对应关系。对应关系。HashHash(散列)文件(散列)文件。它采用计算寻址方法,将记录键值。它采用计算寻址方法,将记录键值通过通过HashHash函数计算转换成相应记录的地址。函数计算转换成相应记录的地址。示例示例下一页上一页停止放映第第 49/76 页页文件的目录结构文件的目录结构l文件组织体系中还包括文文件组织体系中还包括文件的目录结构。件的目录结构。l用户使用的是文件的逻辑用户使用的是文件的

48、逻辑结构,系统使用的是文件的结构,系统使用的是文件的物理结构,在两种不同的组物理结构,在两种不同的组织结构之间似乎应该有衔接织结构之间似乎应该有衔接的纽带。的纽带。l衔接的纽带就是衔接的纽带就是文件文件的目录结构的目录结构。l通过文件的目录结构,将通过文件的目录结构,将文件的逻辑结构和文件的物文件的逻辑结构和文件的物理结构联系在了一起。理结构联系在了一起。下一页上一页停止放映第第 50/76 页页例例3-10 驱动器浏览程序驱动器浏览程序解题思路:解题思路:l本程序显示操作系统中的所有盘符,程序中用到本程序显示操作系统中的所有盘符,程序中用到MFC和和Windows API函数;函数;lCSt

49、ring代表一个字符串对象;代表一个字符串对象;lSetAt 函数改变字符串某个位置的字符;函数改变字符串某个位置的字符;lGetLength函数取得字符的长度;函数取得字符的长度;lGetBuffer函数将一个函数将一个CString型的字符串转换为型的字符串转换为LPTSTR类型的指定长度的字符串;类型的指定长度的字符串;l宏变量宏变量DRIVE_REMOVABLE、DRIVE_FIXED、DRIVE_REMOTE、DRIVE_CDROM和和DRIVE_RAMDISK分别表示不同类型的盘,在程分别表示不同类型的盘,在程序代码中有说明。序代码中有说明。下一页上一页停止放映第第 51/76 页

50、页程序步骤程序步骤 调用调用API函数函数GetLogicalDrives取得取得“我的电脑我的电脑”中的所有逻辑盘,并得到一个中的所有逻辑盘,并得到一个DWORD类型的数,类型的数,其中的某一位为其中的某一位为1时表示该位代表的盘存在。其中时表示该位代表的盘存在。其中GetLogicalDrives函数的格式为:函数的格式为:DWORD GetLogicalDrives(VOID);通过提取通过提取dwDriveList的每一位,得到所有盘符;的每一位,得到所有盘符;调用调用API函数函数GetDriveType判别每一盘符的类型,判别每一盘符的类型,其中其中GetDriveType函数的格

51、式为:函数的格式为:UINT GetDriveType(int nDrive)下一页上一页停止放映第第 52/76 页页程序程序#include#include void main()int nPos=0;UINT nCount=0;CString strDrive=?:;DWORD dwDriveList=GetLogicalDrives();/取得我的电脑的所有盘取得我的电脑的所有盘 CString cTmp;UINT nType;cout我的电脑包含如下盘我的电脑包含如下盘:endl;while(dwDriveList)if(dwDriveList&1)cTmp=strDrive;str

52、Drive.SetAt(0,0 x41+nPos);/将数字表示的盘符转换为字母将数字表示的盘符转换为字母 coutstrDrive.GetBuffer(strDrive.GetLength();/将字符串转换为指定格式将字符串转换为指定格式 nType=GetDriveType(LPCTSTR)strDrive);/取得每个盘的类型取得每个盘的类型 switch(nType)case DRIVE_REMOVABLE:cout可移动盘可移动盘endl;break;case DRIVE_FIXED:cout逻辑硬盘逻辑硬盘endl;break;case DRIVE_REMOTE:cout网络盘网

53、络盘endl;break;case DRIVE_CDROM:coutCDROM盘盘endl;break;case DRIVE_RAMDISK:coutRAM盘盘endl;break;default:cout未知类型盘未知类型盘=1;/准备取得下一个盘符准备取得下一个盘符 nPos+;cout共:共:nCount个盘个盘endl;下一页上一页停止放映第第 53/76 页页程序运行结果程序运行结果 例3-10执行代码下一页上一页停止放映第第 54/76 页页例例3-11 判别指定文件或文件夹属性判别指定文件或文件夹属性算法分析算法分析1.从命令行输入指定的文件或目录名称,可以包含通配从命令行输入指

54、定的文件或目录名称,可以包含通配符符(“*”和和“?”)。命令格式为:。命令格式为:命令命令 文件名文件名1.使用使用FMC的的CFileFind类的类的FindFile函数对指定文件进函数对指定文件进行查找。行查找。2.CFileFind类的类的FindNextFile函数对指定文件继续进行函数对指定文件继续进行查找(因指定的文件可能含有通配符)。查找(因指定的文件可能含有通配符)。3.分别通过函数分别通过函数GetFileName、GetFilePath、IsDirectory、IsReadOnly和和GetCreateTime得到文得到文件的名称、路径、是否目录、是否只读和建立时间等,件

55、的名称、路径、是否目录、是否只读和建立时间等,并显示相应结果。并显示相应结果。下一页上一页停止放映第第 55/76 页页 解题思路解题思路l本应用用到本应用用到MFC的的CFileFind类的类的FindFile、FindNextFile、GetFileName、GetFilePath、IsDirectory、IsReadOnly和和GetCreateTime函数;函数;l还用到还用到CTime类的类的GetYear、GetMonth、GetDay函数取得文件建立的时间(年、月、函数取得文件建立的时间(年、月、日)。日)。下一页上一页停止放映第第 56/76 页页 源程序源程序#include

56、#includevoid main(int argc,char*argv)if(argc2)cout 使用格式:使用格式:Example3_11 endl;exit(1);CFileFind finder;BOOL bWorking=finder.FindFile(argv1);/取得命令行参数指定的文件名取得命令行参数指定的文件名,并查询并查询while(bWorking)bWorking=finder.FindNextFile();/继续查询下一个文件继续查询下一个文件cout 文件名称:文件名称:(LPCTSTR)finder.GetFileName()endl;cout 文件路径:文件

57、路径:(LPCTSTR)finder.GetFilePath()endl;if(finder.IsDirectory()cout 目录目录endl;elsecout 文件文件 endl;if(finder.IsReadOnly()cout 只读只读 endl;CTime fileTime;finder.GetCreationTime(fileTime);/取得文件建立时间取得文件建立时间cout 建立时间是:建立时间是:fileTime.GetYear()年年;cout fileTime.GetMonth()月月;cout fileTime.GetDay()日日 endlendl;下一页上一页

58、停止放映第第 57/76 页页程序运行结果程序运行结果 例3-11执行代码下一页上一页停止放映第第 58/76 页页 例例3-12 读取位图文件属性程序读取位图文件属性程序l算法分析算法分析 从命令行输入指定的位图文件名称;从命令行输入指定的位图文件名称;命令格式为:命令格式为:命令命令 位图文件名位图文件名 定义位图文件头结构变量定义位图文件头结构变量BitmapFileHeader;定义位图信息结构变量定义位图信息结构变量BitmapInfo;打开指定文件;打开指定文件;使用函数使用函数fread分别读取位图文件头和位图信息;分别读取位图文件头和位图信息;关闭指定文件。并显示位图文件名称、

59、位图文关闭指定文件。并显示位图文件名称、位图文件类型、图像宽度、图像高度和每个像素的位数。件类型、图像宽度、图像高度和每个像素的位数。下一页上一页停止放映第第 59/76 页页 解题思路解题思路l 位图文件是位图文件是WindowsWindows操作系统中很重要的一种图操作系统中很重要的一种图形格式,本例是对位图文件的简单操作。形格式,本例是对位图文件的简单操作。l本程序用到的结构体和函数有:本程序用到的结构体和函数有:BITMAPFILEHEADER BITMAPFILEHEADER /位图文件头结构位图文件头结构体体 BITMAPINFO BITMAPINFO /位图信息结构体位图信息结构

60、体 freadfread()函数()函数 /文件读函数文件读函数下一页上一页停止放映第第 60/76 页页BITMAPFILEHEADERBITMAPFILEHEADER格式格式位图文件头结构体为:位图文件头结构体为:typedef struct tagBITMAPFILEHEADERtypedef struct tagBITMAPFILEHEADER WORD bfType WORD bfType;/;/文件类型文件类型 DWORD bfSizeDWORD bfSize;/;/文件大小文件大小 WORD bfReserved1;/WORD bfReserved1;/文件保留文件保留1 1 W

61、ORD bfReserved2;/WORD bfReserved2;/文件保留文件保留2 2 DWORD bfOffBits DWORD bfOffBits;/;/;下一页上一页停止放映第第 61/76 页页位图信息结构体位图信息结构体位图信息结构体位图信息结构体BITMAPINFO的格式为:的格式为:typedef struct tagBITMAPINFOtypedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader BITMAPINFOHEADER bmiHeader;/位图像素、像素位数位图像素、像素位数 RGBQUAD bmiColors

62、1;RGBQUAD bmiColors1;/颜色颜色 BITMAPINFO;BITMAPINFO;下一页上一页停止放映第第 62/76 页页FreadFread函数函数函数函数fread的格式如下:的格式如下:size_t fread(void*buffer,/文件缓冲区文件缓冲区 size_t size,/缓冲区块长度缓冲区块长度 size_t count,/缓冲区块个数缓冲区块个数 FILE*stream /文件流指针文件流指针);下一页上一页停止放映第第 63/76 页页源程序源程序#include#include#includevoid main(int argc,char*argv)

63、if(argc2)cout用法:用法:Example3_12 endl;exit(1);BITMAPFILEHEADER BitmapFileHeader;/定义位图文件头结构变量定义位图文件头结构变量BITMAPINFO BitmapInfo;/定义位图信息结构变量定义位图信息结构变量 FILE*fp=fopen(argv1,rb);/打开命令行指定的文件打开命令行指定的文件if(fp=NULL)cout文件文件:argv1打开错误打开错误endl;exit(1);fread(&BitmapFileHeader,sizeof(BITMAPFILEHEADER),1,fp);/读位图文件头读位

64、图文件头fread(&BitmapInfo,sizeof(BITMAPINFO),1,fp);/读位图信息读位图信息fclose(fp);/关闭文件关闭文件cout位图文件名称为位图文件名称为:argv1endl;cout位图文件类型为位图文件类型为:(char)BitmapFileHeader.bfType;cout(char)(BitmapFileHeader.bfType/0 x100)endl;cout位图文件的大小位图文件的大小:BitmapFileHeader.bfSizebytesendl;cout图像宽度图像宽度:BitmapInfo.bmiHeader.biWidth点点en

65、dl;cout图像高度图像高度:BitmapInfo.bmiHeader.biHeight点点endl;switch(BitmapInfo.bmiHeader.biBitCount)/每个像素的位数每个像素的位数 case 0:coutJPEG图图endl;break;case 1:cout单色图单色图endl;break;case 4:cout16色图色图endl;break;case 8:cout256色图色图endl;break;case 16:cout64K图图endl;break;case 24:cout16M真彩色图真彩色图endl;break;case 32:cout4G真彩色图

66、真彩色图endl;break;default:cout单位像素位数未知单位像素位数未知GetSafeHwnd()取得;lpOperation可以是“open”(打开)、“print”(打印)和“explore”(浏览目录)、参数lpFile为需要处理的文件名、参数lpParameters为文件参数,参数pDirectory为文件目录,参数nShowCmd为窗口打开的大小(SW_SHOWNORMAL、SW_SHOWMAXIMIZED等)。下一页上一页停止放映第第 67/76 页页程序步骤程序步骤在在VC+中建立文档视图的程序框架,工程命名为中建立文档视图的程序框架,工程命名为“Example3_15”;加入一个新对话框,并按下列要求设计对话框资源:加入一个新对话框,并按下列要求设计对话框资源:对话框资源号为:对话框资源号为:“IDD_STUDENTDIALOG”;对话框窗口标题为:对话框窗口标题为:“增加学生期末考试成绩增加学生期末考试成绩”;设置对话框中对象的属性;放置设置对话框中对象的属性;放置6个静态文本控件,个静态文本控件,6个个编辑文本控件,编辑文本控件,2个按钮控件,以及对应

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!