王者荣耀官方网站s网站优化
news/
2025/9/22 19:27:19/
文章来源:
王者荣耀官方网站,s网站优化,欧莱雅旗下品牌,推广赚钱的软件排行计算机室如何管理自身所存放着的大量的信息的呢#xff1f;windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的。 面向存储的文件技术 什么是文件#xff1f;计算机中#xff0c;一篇文章、一幅图片、一个程序等都是以文…计算机室如何管理自身所存放着的大量的信息的呢windows的磁盘管理程序为我们提供了一套严密而又高效的信息组织形式--硬盘上的信息是以文件的形式被管理的。 面向存储的文件技术 什么是文件计算机中一篇文章、一幅图片、一个程序等都是以文件的形式存储在磁盘上的每个文件都有一个文件名。计算机就是对文件按名存取的。文件名的格式如下主文件名.扩展名。 为什么要在程序中使用文件 通常程序中的数据在程序运行结束之后就会从内存中清除再次运行程序时不会自动出现。在编制程序的过程中不可避免的会遇到将某些数据永久保存的问题当程序关闭后依然可以使用这些数据这时就需要进行文件操作。 文件类型 Visual C处理的文件通常分为两种 文本文件只可被任意文本编辑器读取ASCII文本。 二进制文件 指对包含任意格式或无格式数据的文件的统称。 这里只介绍文本文件的读写INI文件也属于文本文件的范畴且INI文件的结构和用途与普通的文本文件不同所以会单独介绍。 第一部分文本文件 文本文件的读写 认识CFile类认识文本文件能够正确灵活应用文本文件存取信息避免文本文件读写的常见误区。 CFile是MFC的文件操作基本类它直接支持无缓冲的二进制磁盘I/O操作并通过其派生类支持文本文件、内存文件和socket文件。 客户操作记录实例功能预览及关键知识点 许多系统出于安全或其他原因常常要求随时对键盘进行监控利用Hook钩子技术编写的应用程序能够很好地达到这个目的。本软件就制作了一个客户操作记录软件即在软件运行过程中用户在键盘上的按键操作会被记录下来这样对维护软件的正常运行非常有利。 只要启动客户操作记录软件后不管输入焦点是否在本软件上按键都会被记录下来。我们需要的是键盘的系统监控只要本软件在运行无论当前计算机在做什么都能监测到用户按键的行为并做出反应这就要用到Hook技术。 Hook技术在很多特殊软件中广泛应用如金山词霸的“取词”功能就用到了Hook计技术。 钩子的本质是一段用以处理系统消息的程序通过系统调用将其挂入系统。钩子的种类很多每种钩子可以截获并处理相应的消息每当特定的消息发出在到达目的窗口之前钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理甚至可以强制结束消息的传递。 从钩子的本质来看可以优先截获操作系统的各种消息进行处理所以它几乎无所不能因为windows的应用程序都是基于消息驱动的应用程序的操作都依赖于它所得到的消息的类型及内容。 如果Hook过程在应用程序中实现若应用程序不是当前窗口时该Hook就补齐作用如果Hook在DLL中实现程序在运行中动态调用它它能实时对系统进行监控。根据需要我们采用的是在DLL中实现Hook的方式。 应用程序exe? 和DLL的区别所在 文本文件存储管理 字符被计算机处理时都是以二进制代码的形式出现的即一个字符对应一个8位二进制数这种二进制码的集合就是所谓的ASCII码。 基本的ASCII码有128个最高位都是0对应的十进制数是0-127。键盘上的字符如英文字母、数字和一些常用符号使用基本ASCII部分。如数字“0”的ASCII码用二进制数表示就是00110000即十进制数48。 扩展的ASCII码有128个最高位是1对应的十进制数是128-255。一些制表符和其他符号使用扩展的ASCII码部分。 为解决汉字的存储和显示问题我国制定了国际GB2312。据此规定一个汉字由2个扩展的ASCII码组成这种高位为1的双字节汉字编码就是汉字的机内码简称为内码。例如汉字“学”的机内码用二进制数表示就是11010001 10100111即十进制数206 和167 用十进制表示就是53671206*256167。对于字符文本文件存储的是它的ASCII码对于汉字文本文件存储的是它的内码即两位ASCII码如字符串“0学0”在文本文件中存储的内容是00110000 11010001 10100111 00110000 正确的文本文件读写过程 1.定义文件变量2.打开指定的文件3.向从文本文件中写入信息4.从文本文件中读取信息5.关闭文件 1、定义文件变量 定义文件变量格式CStdioFile 文件变量 例如定义一个名称为f1的文件变量语句如下CStdioFile f1; 2、打开指定文件 可以直接通过CStdioFile的构造函数来打开磁盘文件同时可以用标志位指定打开方式只读、只写、读写等 CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags); 其中lpszFileName表示要打开的文件名可以是相对路径或绝对路径 nOpenFlags设置文件打开方式标志位可以指定用“|”连接多个标志位。下面是常用的打开标志 CFile::typeText以文本文件的形式打开文件 CFile::typeBinary以二进制文件的形式打开文件 CFile::modeCreate如果指定文件名的文件不存在则新建文件如果文件存在并且没有设置CFile::modeNoTruncate标志则清空文件。 CFile::modeNoTruncate如果文件存在不把它的长度删除为0即不清空文件中的数据。 CFile::modeRead以只读方式打开文件 CFile::modeReadWrite以可读可写方式打开文件 CFile::modeWrite以只写方式打开文件 CFile::shareDenyNone文件打开后不禁止其他进程对文件的读写操作 CFile::shareExclusive文件打开后禁止其他进程对文件的读写操作 CFile::shareDenyRead文件打开后禁止其他进程对文件的读操作 CFile::shareDenyWrite文件打开后禁止其他进程对文件的写操作 此外可以不在构造函数中打开文件而仅仅调用空的构造函数CStidoFile然后用CStdioFile::Open()打开文件。Open函数的前两个参数和非空构造函数的参数相同其声明如下 BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pErrorNULL); 第3个参数与打开失败时的异常处理有关。 实例1以只读方式打开一个文件 步骤 使用AppWizard创建一个对话框应用程序删除其自动产生的所有控件添加一个Button控件。双击控件在相应的函数里添加代码 char * pszFileNameC://myfile.txt; CStdioFile myFile; CFileException fileException; if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeRead),fileException) { TRACE(Cant open file %s, error %u/n,pszFileName,fileException.m_cause); } 运行结果如果C:/下没有myfile.txt文件则新生成该文件。 3.向从文本文件中写入信息 CStdioFile提供了函数WriteString来向文本文件中写入文本WriteString函数的格式如下 void WriteString(LPCTSTR lpsz); WriteString的参数lpsz是一个以”/0”字符结束的字符串要把这个字符串的内容写入文件。 提示使用WriteString函数时如果希望每执行一次WriteString文本文件中的内容就会自动换行一次那么就需要在需要换行的地方输出“/n” myFile.WriteString(“第1行/n”) 实例2向文件中写入文本 建立MFC基于对话框的程序删除自动添加的所有控件添加一个“确定”按钮双击按钮按默认添加事件函数双击按钮在相应的函数处添加如下代码 char* pszFileNameC://myfile.txt; CStdioFile myFile; CFileException fileException; if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),fileException) { myFile.WriteString(第1行/n); CString strOrder; strOrder.Format(%d,%.3f,66,88.88); myFile.WriteString(strOrder); } else { TRACE(Cant open file %s,error%u/n,pszFileName,fileException.m_cause); } 程序运行结果C:/myfile.txt文件中内容如下 第1行 66,88.880 4.从文本文件中读取信息 CStidoFile提供了函数ReadString来读取文本ReadString有两种形式一种为 virtual LPTSTR ReadString(LPTSTR lpsz, UINIT nMax); ReadString函数的参数如下 lpsz 是用户提供的一个指向字符串的指针它用来接受从文件读出的文本以”/0”结束。 nMax是本次所允许读入的文本字符个数不计“/0”字符也就是说最多能读入nMax-1个文本字符。 ReadString的返回值是一个LPTSTR类型的指针它指向从文件读出的文本字符串如果到达文件尾则返回NULL。 ReadString的另一种形式为 BOOL ReadString(CString rString); 参数rString用来容纳从文件读出的文本。 CString版本忽略回车换行符返回值是一个布尔值。如果返回值为FALSE表示因到达文件尾而没有读到任何字符。 提示每执行一次ReadString就会自动从文本文件中读取一行数据同时文件操作指针会自动跳转到下一行。 实例3从文件中读取文本信息 步骤创建基于对话框的MFC程序删除所有自动添加的控件添加按钮控件为按钮添加事件并在相应的函数处添加如下代码 char* pszFileNameC://myfile.txt; CStdioFile myFile; CFileException fileException; if(myFile.Open(pszFileName,CFile::typeText|CFile::modeReadWrite),fileException) { myFile.SeekToBegin(); CString str1; myFile.ReadString(str1); CString str2; myFile.ReadString(str2); AfxMessageBox(str1str2); } else { TRACE(Cant open file %s,error%u/n,pszFileName,fileException.m_cause); } myFile.Close(); 程序运行结果为程序F9设置断点然后F5单步执行结果如下 5.关闭文件 对文件的操作完成后使用CloseFile关闭文件。 函数CStdioFile::Close关闭一个文件一般一个文件使用完毕就应该关闭它 myFile.Close(); 错误的文本文件读写过程 在读写文本文件的时候最常见的错误是---操作文件不存在。这种错误产生的典型原因有 1.路径错误 char * pszFileNameC://Windows//MyFile.txt; CStdioFile myFile; CFileException fileException; if(!myFile.Open(pszFileName,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite),fileException) { //文件操作代码 } else { TRACE(Cant open file %s, error %u/n,pszFileName,fileException.m_cause); } myFile.Close(); 由于将文件变量与一个绝对路径的文件名关联而程序的数据通常存储在相对路径下所以一旦相对路径和相对路径不一致时就会出错。 举例而言上一段程序本意是想从windows的安装目录下面的MyTextFile.txt文件中读取一行数据但是如果操作系统安装的路径不是C:/Windwos而是C:/Winnt,那么这段程序就会出错。 解决方法是在程序中使用相对路径改正后的程序如下 //获取windows路径 LPTSTR lpBuffernew char[MAX_PATH]; ::GetWindowsDirectory(lpBuffer,MAX_PATH); strcat(lpBuffer,//MyFile.txt); CStdioFile myFile; CFileException fileException; if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),fileException) { //文件操作代码 } else { TRACE(Cant open file %s, error %u/n,pszFileName,fileException.m_cause); } CString strFileTitleMyFile.txt; CStdioFile myFile; CFileException fileException; if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeReadWrite),fileException) { //文件操作代码 myFile.WriteString(测试); } else { TRACE(Cant open file %s, error %u/n,pszFileName,fileException.m_cause); } myFile.Close(); 2.操作文件不存在 如果应用程序所有路径下面不存在MyFile.txt文件那么在WriteString写入信息时就会出错。 解决办法就是在程序中打开文件前要检查是否存在此文件。如下程序 CString strFileTitleMyFile.txt; CFileFind finder; if(finder.FindFile(strFileTitle)) { CStdioFile myFile; CFileException fileException; if(myFile.Open(lpBuffer,CFile::typeText|CFile::modeCreate|CFile::modeReadWrite),fileException) { //文件操作代码 } else { TRACE(Cant open file %s, error %u/n,pszFileName,fileException.m_cause); } } else { TRACE(Cant find file %s/n,strFileTitle); } myFile.Close(); 3.超越文件权限进行读写操作 在打开文件的过程中通过参数指定了文件的读写权限如果读写的操作没有和相应的权限对应就会出现错误。 下面的程序就是典型的忽略了文件操作权限的例子 CString strFileTitleMyFile.txt; CStdioFile myFile; CFileException fileException; if(myFile.Open(strFileTitle,CFile::typeText|CFile::modeCreate|CFile::NoTruncate|CFile::modeRead),fileException) { //文件操作代码 myFile.WriteString(测试!); } else { TRACE(Cant open file %s,error%u/n,strFileTitle,fileException.m_cause); } myFile.Close(); 支招儿 1.准确定位文件的路径 操作文件的过程中经常需要将文本文件放在程序自身的目录中但是如果仅仅在程序中使用不指定任何路径信息的相对路径如 myFile.Open(MyFile.txt,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite); 那么就有可能出现不能正确定位的情况准确定位文件位置的方法是获得可执行程序自身的绝对路径如 TCHAR FilePath[MAX_PATH]; GetModuleFileName(NULL,FilePath,MAX_PATH); (_tcstchr(FilePath,//))[1]0; lstrcat(FilePath,_T(MyFile.txt)); CStdioFile myFile; CFileException fileException; if(myFile.Open(FilePath,CFile::modeCreate|CFile::typeText|CFile::modeReadWrite),fileException) { //文件操作代码 } else { TRACE(Cant open file %s,error%u/n,FilePath,fileException.m_cause); } myFile.Close(); 2.读文本文件指定的一行并得到文本文件的总行数。 读文本文件指定的一行并得到文本文件的总行数 要统计文本文件的总行数可以从头逐行读直到文件尾程序 CStdioFile myFile; CFileException fileException; if(myFile.Open(MyFile.txt,CFile::modeCreate|CFile::modeNoTruncate|CFile::typeText|CFile::modeReadWrite),fileException) { CString strContent; int order1; while(myFile.ReadString(strContent)) { if(2order) { AfxMessageBox(strContent); } orderorder1; } } else { TRACE(Cant open file); } myFile.Close(); 实例演示文件操作过程 客户操作记录实例 本软件分为两个部分一部分是DLL模块里面利用Hook技术完成键盘监控和写入文件的功能另一部分是界面部分调用DLL启动和停止客户操作记录功能。 第1步创建MFC DLL项目 第2步创建TestHook.h文件 第3步加入全局共享数据变量 第4步保存DLL实例句柄 第5步类CKeyboradHook的成员函数 第6步创建钩子可执行程序 第1步创建MFC DLL项目 创建一个名为HookTest的projectproject的类型为选择MFC AppWizard(DLL),DLL类型为MFC Extension DLL(using shared MFC DLL) 注意选择File-New菜单项在弹出对话框的左边的列表框中选择MFC AppWizard(DLL). 在project name文本框中输入项目名称HookTestlocation中输入项目的存盘路径选中Create new workspace在platForms列表中选择Win32选项。 单击OK按钮继续下一步在弹出的对话框中设置DLL类型为MFC Extension DLLusing shared MFC DLL. 在IDE中选择FileView选项卡在其中就会发现其中有HookTest.cpp文件却没有HookTest.h文件这是因为visual C6.0中没有现成的钩子类所以要自己动手创建TestHook.h文件在其中建立钩子类。 第2步创建TestHook.h文件 选择File菜单再选择New菜单项将弹出New对话框。选择files选项卡并且选择其中的C/C Header File. 选中add to project并且在对应的下拉列表中选择项目名称HookTest在location文本框中输入项目的存盘路径或单击右边的按钮选择相应的路径在file对应的文本框中输入文件名HookTest.h单击OK按钮在IDE中自动打开Hooktest.h文件供编辑代码用 TestHook.h文件 #if _MSC_VER1000 #pragma once #endif //_MSC_VER1000 class AFX_EXT_CLASS CHookTest:public CObject { public: CHookTest(); ~CHookTest(); BOOL StartHook();//StartHook()函数实现安装钩子 BOOL StopHook();//StopHook()函数实现卸载钩子 }; 第3步加入全局共享数据变量 HookTest.cpp文件中添加 //存储各个键赌赢的字符 CString cskey[TOTAL_KEYS] { BACKSPACE, TAB, …… F12, }; //存储各个键对应的键值 int nkey[TOTAL_KEYS] { 0X08, //BACKSPACE, 0X09, //TAB, ……. 0x7b,//F12, }; #pragma data_seg(mydata) //安装的键盘钩子子句柄 HHOOK glhTestHookNULL; //DLL实例句柄 HINSTANCE glhkInstanceNULL; #pragma data_seg() 第4步保存DLL实例句柄 DllMain函数中添加如下代码 if (dwReason DLL_PROCESS_ATTACH) { TRACE0(HOOKTEST.DLL Initializing!/n); //扩展DLL仅初始化一次 if (!AfxInitExtensionModule(HookTestDLL, hInstance)) return 0; //DLL加入动态MFC类库中 new CDynLinkLibrary(HookTestDLL); //保存DLL实例句柄 glhkInstancehInstance; } else if (dwReason DLL_PROCESS_DETACH) { TRACE0(HOOKTEST.DLL Terminating!/n); //终止这个链接库前调用它 AfxTermExtensionModule(HookTestDLL); } return 1; // ok 第5步类CKeyboradHook的成员函数 //KeyboradProc函数 LRESULT WINAPI KeyboradProc(int nCode,WPARAM wParam,LPARAM lParam) { for(int i0;iTOTAL_KEYS;i) { if(nkey[i](int)wParam) { int nKeyStatuslParam 0x80000000; //根据用户按键播放对应的声音文件 switch(nKeyStatus) case 0://WM_KEYUP //case 0x80000000://WM_KEYUP { char* pszFileNameC://myfile.txt; CStdioFile myFile; CFileException fileException; if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite),fileException) { myFile.SeekToEnd(); //将文件指针移动到文件末尾准备进行追加文本的操作 //此处可以编写追加文本的操作 myFile.WriteString(cskey[i]); } else { TRACE(Cant open file %s,error%u/n,pszFileName,fileException.m_cause); } } } } //调用CallNextHookEx函数把钩子信息传递给钩子链的下一个钩子函数 return CallNextHookEx(glhTestHook,nCode,wParam,lParam); } 第6步创建钩子可执行程序 //**************************** BOOL CHookTest::StartHook() { glhTestHookSetWindowsHookEx(WH_KEYBOARD,KeyboradProc,glhkInstance,0); if(glhTestHook!NULL) return TRUE; return FALSE; } //**************************** /* HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,INSTANCE hMod,DWORD dwThreadId) idHook:钩子类型它是和钩子函数类型一一对应的例如WH_KEYBOARD表示安装的是键盘钩子WH_MOUSE表示的是鼠标钩子等。 lpfn钩子函数的地址 hMod:钩子函数所在的实例的句柄对于线程钩子该参数为NULL对于系统钩子该参数为钩子函数的DLL句柄 dwThreadId:指定钩子所监视的线程的线程号对于全局钩子该参数为NULL. SetWindowsHookEx返回所安装的钩子句柄。 调用StartHook函数后所有键盘的消息都会转移到KeyboradProc函数中通过数组nkey的值与wParam参数相比较可以知道用户按下的是哪个键通过对IParam值的判断可以知道是按下键还是释放键然后播放键对应的声音文件即可。 */ //**************************** //卸载钩子 BOOL CHookTest::StopHook() { BOOL bResultFALSE; if(glhTestHook) { bResultUnhookWindowsHookEx(glhTestHook); if(bResult) { glhTestHookNULL; } } return bResult; } //**************************** 第二部分INI文件 INI文件的读写 Windows操作系统将win.ini作为记录当前系统状态并根据其记录内容对系统进行配置的一种便捷的方法且众多的应用软件也广泛的使用该类型的配置文件来对软件进行记录和配置。 配置设置文件INI文件是windows操作系统中的一种特殊的ASCII文件以ini为文件扩展名。该文件也被称为初始化文件initialization file和概要文件profile通常应用程序可以拥有自己的配置设置文件来存储状态信息。一般来说私有的配置设置文件比较小这样可以减少程序在初始化时读取配置文件时的信息量从而提高程序的启动速度、提高应用程序和系统的性能。 如果带存取的信息涉及到windows系统环境或是其他应用程序时就必须在windows系统的配置文件win.ini中记录并在访问的同时发送WM_WININICHANGE消息给所有的顶层窗口通知其他的程序系统配置文件已做了更改。但由于win.ini中不仅记录了系统的有关信息也存储着许多其他应用软件的配置数据所以访问的数据量要远比私有配置文件大的多。 掌握内容 了解INI文件的结构能够正确灵活的应用INI文件存取信息避免INI文件读写的常见误区。 INI文件存储管理 配置文件里的信息之所以能为系统和终生的软件所读取并识别是由于其内部对数据的存取采用了预先约定的“项-值对entry-value pairs”存储结构并对待存取的数据分门别类地进行调理清晰的存储。INI文件的结构如下 注释 [小节名] 关键字值 … INI文件允许有多个小节每个小节又允许有多个关键字“”后面是该关键字的值。值的类型有3种字符串、整型数值和布尔值。其中字符串存储在INI文件中时没有引号布尔值用1表示布尔假值用0表示。 注释以分号“”开头。 Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读、写 GetPrivateProfileInt: 从私有初始化文件即自定义的INI文件获取整型数值。 GetPrivateProfileString: 从私有初始化文件获取字符串型值。 GetProfileInt从win.ini获取整数值。 WritPrivateProfileString写字符串到私有初始化文件。 WriteProfileString写字符串到win.ini。 需要指出的是当向配置文件存储信息时不论是数据还是字符串都要先转换成字符串然后再进行存储。 这里只介绍私有初始化文件所以只涉及到3个函数---GetPrivateProfileString、GetPrivateProfileInt和WritePrivateProfileString。 INI文件读写过程 INI文件的读和写操作是分开的首先介绍写文件的方法。 1. INI文件的写过程 将信息写入INI文件中所用的函数为 BOOL WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpString,LPCTSTR lpFileName); 其中各参数的意义 lpAppName是INI文件中的一个字段名。 lpKeyName是lpAppName下的一个键名通俗讲就是变量名。 lpString是键值也就是变量的值不过必须为LPCTSTR型或CString型的。 lpFileName是完整的INI文件名。 实例1将信息写入INI文件 将一名学生的姓名和年龄写入C:/student.ini文件中。 步骤创建基于对话框的MFC程序删除所有自动生成的控件然后添加按钮控件并在相应的按钮事件处添加如下代码 CString strName,strTemp; int nAge; strName张三; nAge12; ::WritePrivateProfileString(Info,Name,strName,C://student.ini); strTemp.Format(%d,nAge); ::WritePrivateProfileString(Info,Age,strTemp,C://student.ini); 运行结果C盘下创建了student.ini文件文件内容如下 [Info] Name张三 Age12 2. INI文件的读过程 将信息从 INI文件中读出到程序中所用的函数为 DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName); 其中各参数的意义如下 前两个参数与WritePrivateProfileString中的意义一样。 lpDefault如果INI文件中没有前两个参数指定的字段名或键名则将此值赋给变量。 lpReturnedString接收INI文件中没有前两个参数指定的字段名或键名则将此值赋给变量。 lpReturnedString接受INI文件中的值的CString对象即目的缓存器。 nSize目的缓存器的大小。 lpFileName是完整的INI文件名。 实例2从INI文件读出信息 程序将C:/student.ini文件中的信息读出到程序中。 步骤如前在相应的button按钮响应事件函数处添加如下代码 CString strStudName; int nStudAge; GetPrivateProfileString(Info,Name,默认姓名,strStudName.GetBuffer(MAX_PATH),MAX_PATH,C://student.ini); //读入整型值 //UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName); nStudAgeGetPrivateProfileInt(Info,Age,10,C://student.ini); 运行结果可以通过设置断点来查看strStudName和nStudAge的内容。 错误的INI文件读写 1.路径指示错误 INI文件的路径必须完整文件名前面的各级目录必须存在否则写入不成功该函数返回FALSE值。 如下程序 CString strName,strTemp; int nAge; strName”张三”; nAge12; ::WritePrivateProfileString(“Info”,”Name”,strName,”c://Info/student.ini”); 如果C:/Info目录不存在那么写INI文件的操作就会失败。 解决办法是进行文件操作前通过以下代码检查目录是否存在 WIN32_FIND_DATA fd; HANDLE hFindFindFirstFile(“C://Info”,fd); If((hFind!INVALID_HANDLE_VALUE)(fd.dwFileAttributesFILE_ATTRIBUTE_DIRECTORY)) { AfxMessageBox(“存在”) } else { AfxMessageBox(“不存在”) } FindClose(hFind); 2.认识上的两个误区 误区一写文件路径的时候写成诸如C:/Info的形式实际上在visual C中文件名的路径中必须为//因为在visual C中//才表示一个/所以正确的格式应改为C://Info. 误区二因为经常需要把INI文件放在程序所在目录所以在写INI文件的函数中直接将lpFileName参数设置为文件名如“student.ini”。这是不正确的做法打开INI文件的时候如果文件名没有指明路径的话那么这个INI文件会存储在windows目录中而不是在应用程序的当前目录中。 解决办法是lpFileName参数设置为“.//student.ini”。 教你一招----如何循环读写多个值 假设现在有一个程序要将最近使用的几个文件名保存下来写入的代码如下 CString strTemp,strTempA; int I; int nCount6; for(i0;inCount;i) { strTemp.Format(“%d”,i); strTemp.Format(“%s%d%s”,”File”,i,”.txt”);//文件名 ::WritePrivateProfileStirng(“UseFileName”,”FileName”strTemp,strTempA,”c://usefile.ini”); } strTemp.Format(“%d”,nCount); ::WritePrivateProfileString(“FileCount”,”Count”,strTemp,”C://usefile.ini”); //将文件总数写入以便读出。 以上代码运行后C盘下面userfile.ini文件内容。 实例3将信息写入INI文件 步骤创建基于对话框的MFC程序删除所有自动生成的控件然后添加按钮控件并在相应的按钮事件处添加如下代码 CString strTemp,strTempA; int i; int nCount6; for(i0;inCount;i) { strTemp.Format(%d,i); strTempA.Format(%s%d%s,File,i,.txt);//文件名 ::WritePrivateProfileString(UseFileName,FileNamestrTemp,strTempA,c://usefile.ini); } strTemp.Format(%d,nCount); ::WritePrivateProfileString(FileCount,Count,strTemp,C://usefile.ini); 运行结果C盘下创建了usefile.ini文件文件内容如下 [UseFileName] FileName0File0.txt FileName1File1.txt FileName2File2.txt FileName3File3.txt FileName4File4.txt FileName5File5.txt [FileCount] Count6 实例4从INI文件读出信息 程序将C:/student.ini文件中的信息读出到程序中。 步骤如前在相应的button按钮响应事件函数处添加如下代码 CString strTemp,strTempA; int i; int nCount; nCount::GetPrivateProfileInt(FileCount,Count,0,c://usefile.ini); for(i0;inCount;i) { strTemp.Format(%d,i); strTempFileNamestrTemp; ::GetPrivateProfileString(UseFileName,strTemp,default.txt,strTempA.GetBuffer(MAX_PATH),MAX_PATH,c://usefile.ini); //strTempA中就存储了文件名 } 运行结果可以通过设置断点来查看strTemp和strTempA的内容。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910122.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!