第十二讲

    技术2022-05-19  30

    一、 常量指针和指针常量的区别: 常量指针是指针所指向的内容是常量,不可修改,但是指针本身存储的是地址,是可以修改的。形式是:const char * p。 指针常量是指针本身是常量,不可修改,但是指针所指向的内容是可以修改的,和常量指针正好相反。形式是:char * const。 以下用的是C语言中的文件函数: 二、 文件的写入与读取: 1、 在菜单栏里创建一个文件写入与读取的菜单项,并分别对其进行命令响应。 2、 在文件写入的命令响应函数中,进行如下操作: void CFileView::OnFileWrite() { // TODO: Add your command handler code here FILE *pFile=fopen("piao.txt","w");//打开一个文件,打开模式为“写”。 fwrite("I miss you !",1,strlen("I miss you !"),pFile); //每次写入之后,指针都自动指向文件的末位置。 //fseek(pFile,0,SEEK_SET); //把指针设置到文件头的位置,第二个参数是偏移量,第三个参数是从哪开始找 //fwrite("LoveDay",1,strlen("LoveDay"),pFile); //fclose(pFile); fflush(pFile);//更新内存。将内存内容写入磁盘。 } 3、 在文件读取的命令响应函数中,进行如下操作: void CFileView::OnFileRead() { // TODO: Add your command handler code here FILE *pFile=fopen("piao.txt","r"); char ch[100]; memset(ch,0,100);//进行初始化,将字符数组全部设为0 fread(ch,1,100,pFile);//读取文件的内容到数组ch中。 MessageBox(ch); } 下面进行功能的强化,就是根据文件的大小,来设定数组的大小。 void CFileView::OnFileRead() { // TODO: Add your command handler code here FILE *pFile=fopen("piao.txt","r"); fseek(pFile,0,SEEK_END);//把文件指针放到文件末尾 int len=ftell(pFile);//取得文件的长度 char *pBuf; pBuf=new char[len+1];//动态申请一个内存 fseek(pFile,0,SEEK_SET);//再把指针放回到文件的起始位置 //rewind(pFile);//该函数也是将指针放到文件的起始位置。 fread(pBuf,1,len,pFile); pBuf[len]=0;//将文件最后一个字节设置为0 MessageBox(pBuf); fclose(pFile); } 三、 读取和打开文件的方式:二进制方式和文本方式的区别 按照文本方式往文件中写入数据时,当遇到换行符(ASCII码为10)时,会自动换成回车—换行符(ASCII为13、10),在读取文件时,当遇到回车—换行符(ASCII为13、10)时,则会自动转换为换行字符。 当我们按照二进制方式往文件中写入数据时,则将数据在内存中的存储形式,原样输出到文件中。 可以用下面的例子进行测试: void CFileView::OnFileWrite() { // TODO: Add your command handler code here FILE *pFile=fopen("suo.txt","wb");//默认情况下是以文本方式打开,加上个b是以二进制方式打开 char ch[3]; ch[0]='a'; ch[1]=10;//换行符 ch[2]='b'; fwrite(ch,1,3,pFile); fclose(pFile); } void CFileView::OnFileRead() { // TODO: Add your command handler code here FILE *pFile=fopen("suo.txt","rb");//默认情况下是以文本方式读取,加上个b是以二进制方式读取 char ch[100]; fread(ch,1,3,pFile); ch[3]=0; MessageBox(ch); fclose(pFile); } 四、 文本文件和二进制文件的区别: 1、 文件是计算机在内存中以二进制表示的数据在外部存储介质中的另一种存储形式。 2、 文件分为文本文件和二进制文件。 3、 二进制文件是包含在ASCII码和扩展ASCII码字符中编写的数据和程序指令的文件,一般是可执行程序、图形、图像、声音等文件。 4、 文本文件也叫做ASCII文件,它的每一个字节存放的是可以表示为一个字符的ASCII代码的文件。 下面一个题,更有利于我们理解这些概念: 给你一个整数:98341,将该整数保存到文件中,要求在记事本程序打开该文件时,显示的是98341。 提示:以记事本打开文件,要想看到正确的内容,则该内容必须是以ASCII形式存储的文件,也就是该文件必须是文本文件,如果是二进制文件,则打开的是一堆乱码。 解决方案如下: void CFileView::OnFileWrite() { // TODO: Add your command handler code here FILE *pFile=fopen("suo.txt","w"); int a=98341; char ch[5]; itoa(a,ch,10);//将整形数据转换成字符串数据 fwrite(ch,1,5,pFile); fclose(pFile); } 或: void CFileView::OnFileWrite() { // TODO: Add your command handler code here FILE *pFile=fopen("suo.txt","w"); int a=98341; char ch[5]; ch[0]=9+48;//48是0的ASCII码 ch[1]=8+48; ch[2]=3+48; ch[3]=4+48; ch[4]=1+48;//总之,要将整形转换成字符串,才能用记事本显示正确的内容。 fwrite(ch,1,5,pFile); fclose(pFile); } 再看一下C++语言中的关于文件操作的函数: void CFileView::OnFileWrite() { ofstream ofs("suolpiao.txt"); ofs.write("老婆,对不起,你受苦了!",strlen("老婆,对不起,你受苦了!")); ofs.close(); } void CFileView::OnFileRead() { ifstream ifs("suolpiao.txt"); char ch[100]; memset(ch,0,100); ifs.read(ch,100); ifs.close(); MessageBox(ch); } 下面看一下win32 API 函数中,关于文件操作的函数 void CFileView::OnFileWrite() { // TODO: Add your command handler code here HANDLE hFile; hFile=CreateFile("help.txt",GENERIC_WRITE,0,NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL,NULL); //第二个参数是打开方式,第三个是共享方式,第四个是安全属性,第五个是创建方式,第六个是文件属性,第七个模板文件 DWORD written; WriteFile(hFile,"什么时候,我能和她在一起,永不分开!",strlen("什么时候,我能和她在一起,永不分开!"),&written,NULL); //第四个参数是已写的字节数,第五个参数表示异步还是同步,默认是同步 CloseHandle(hFile); } void CFileView::OnFileRead() { HANDLE hFile; hFile=CreateFile("help.txt",GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); char ch[100]; DWORD dwRead; ReadFile(hFile,ch,100,&dwRead,NULL); ch[dwRead]=0; CloseHandle(hFile); MessageBox(ch); } 下面再看一下MFC给定义的关于文件操作的类:(CFile类) void CFileView::OnFileWrite() { CFile file("aha.txt",CFile::modeCreate|CFile::modeWrite); file.Write("好矛盾啊!",strlen("好矛盾啊!")); file.Close(); } void CFileView::OnFileRead() {//给定了一个固定的buffer。 CFile file("aha.txt",CFile::modeRead); char ch[100]; memset(ch,0,100); file.Read(ch,100); MessageBox(ch); file.Close(); } 或可以根据文本的大小,来给定buffer的大小: void CFileView::OnFileRead() { CFile file("aha.txt",CFile::modeRead); char *pBuf; DWORD len=file.GetLength();//获得文件的长度 pBuf=new char[len+1]; file.Read(pBuf,len); pBuf[len]=0; MessageBox(pBuf); file.Close(); } 五、 打开和另存为对话框的创建: 和此相对应的是一个CFileDialog类: 打开对话框: void CFileView::OnFileRead() { CFileDialog fileDialog(TRUE); fileDialog.m_ofn.lpstrTitle="邢飘打开对话框"; fileDialog.m_ofn.lpstrFilter="Text Files(*.txt)/0*.txt /0Text Files(*.h)/0*.h /0All Files(*.*)/0*.*"; if(IDOK==fileDialog.DoModal()) { CFile file(fileDialog.GetFileName(),CFile::modeRead); char *pBuf; DWORD len=file.GetLength(); pBuf=new char[len+1]; file.Read(pBuf,len); pBuf[len]=0; MessageBox(pBuf); file.Close(); } } 另存为对话框: void CFileView::OnFileWrite() { // TODO: Add your command handler code here CFileDialog fileDialog(FALSE,NULL,"winder"); //第一个参数为FALSE时是保存为对话框,为TRUE时是打开对话框,第三个参数是默认的文件名 fileDialog.m_ofn.lpstrTitle="保存邢飘";//保存为对话框的标题名 fileDialog.m_ofn.lpstrFilter="Text Files(*.txt)/0*.txt /0Text Files(*.h)/0*.h /0All Files(*.*)/0*.*"; //过滤文件的类型,注意书写的格式。 fileDialog.m_ofn.lpstrDefExt="txt";//默认的文件扩展名 if(IDOK==fileDialog.DoModal()) { CFile file(fileDialog.GetFileName(),CFile::modeCreate|CFile::modeWrite); //GetFileName()的作用是获得小呆输入编辑框中的文件名。 file.Write("我想呆!",strlen("我想呆!")); file.Close(); } } 六、 向win.ini文件中,写入信息和读出信息: 写入信息主要应用下面的函数: BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue ); //第一个参数为段名,第二个参数为键名,第三个参数为写入的内容。 应在theFileApp类中的InitInstance()函数中,添加该语句,如下: ::WriteProfileString("My dear","you","me"); 读出信息主要应用下面的语句: CString str; ::GetProfileString("My Dear","suo","her",str.GetBuffer(100),100); AfxMessageBox(str); (注:这些函数都是Win32 SDK函数,对此的操作,都是对win.ini文件的操作)。 七、 向注册表中,写入信息和读取信息: 同上: WriteProfileString("My dear","Piao","I Love You");//向注册表中写数据 CString str; str=GetProfileString("My dear","Piao");//从注册表中读出数据 AfxMessageBox(str); (注:这些函数都是CWinApp类下的成员函数) 八、 对注册表的操作: 在菜单资源中,再加两个菜单项:写注册表和读注册表,并分别对其进行命令响应: void CFileView::OnRegWrite() {//写注册表 // TODO: Add your command handler code here HKEY hKey; RegCreateKey(HKEY_LOCAL_MACHINE,"Software//suolpiao//suo//piao",&hKey); RegSetValue(hKey,NULL,REG_SZ,"I Love You",strlen("I Love You")); //该函数只能存储字符串型的数据。要想存储别的数据,得用RegSetValueEx()函数。如下: // RegSetValueEx(hKey,"age",0,REG_DWORD,(CONST BYTE*)&AgeOfDai,4);//存储的是整形数据。 RegCloseKey(hKey); } void CFileView::OnRegRead() {//读注册表 // TODO: Add your command handler code here LONG lValue; RegQueryValue(HKEY_LOCAL_MACHINE,"Software//suolpiao//suo//piao", NULL,&lValue); //当第四个参数是NULL,第五个参数是NON_NULL时,此时获得的是键内容的长度。 char *pBuf; pBuf=new char[lValue];//按键内容的长度分配内存 RegQueryValue(HKEY_LOCAL_MACHINE,"Software//suolpiao//suo//piao", pBuf,&lValue);//再次调用该函数将键内容存储到pBuf中。 MessageBox(pBuf); } 以上的函数只能对字符串进行操作,要想对别的数据类型进行操作,还得用下面的函数: void CFileView::OnRegWrite() { // TODO: Add your command handler code here HKEY hKey; DWORD AgeOfDai=21; RegCreateKey(HKEY_LOCAL_MACHINE,"Software//suolpiao//suo//piao",&hKey); RegSetValueEx(hKey,"age",0,REG_DWORD,(CONST BYTE*)&AgeOfDai,4);//对整形数据操作 RegCloseKey(hKey); } void CFileView::OnRegRead() { // TODO: Add your command handler code here HKEY hKey; RegOpenKey(HKEY_LOCAL_MACHINE,"Software//suolpiao//suo//piao",&hKey); //打开注册表,使hKey指向所要指的键。 DWORD dwType,dwValue,dwLen; RegQueryValueEx(hKey,"age",0,&dwType,(LPBYTE)&dwValue,&dwLen); CString str; str.Format("age=%d",dwValue); MessageBox(str); }  


    最新回复(0)