第十二章、文件和注册表操作
1. 很多与文件操作相关的函数其形参都是const char* 指向常量的指针;
2. C语言文件的写入
FILE*pFile = fopen("D:\\1.txt","w");//以写的方式打开,在当前工程目录里面
fwrite("http://www.sunxin.org",1,strlen("http://www.sunxin.org"),pFile);
//因为C语言对文件的操作使用了缓冲文件系统
//文件的关闭
fclose(pFile);
如果想不关闭文件,可使用fflush函数来刷新缓冲区中的数据,将他们写入磁盘文件中;
3. 文件指针的定位
Fseek(pFile,0,SEEK_SET);//SEEK_SET从文件的开始的第0处开始写入;
4,文件的读取;
FILE*pFile = fopen("D:\\1.txt","r");
/*
//这里会有问题,后面会出现乱码,后面没有添加'\0'字符
char ch[100];
//fread(ch,1,100,pFile);
*/
/*
//第一种方法,自己数字符数,定义好数组的长度,在后面添加'\0'
//第二种方法,利用memset函数,全设置为零
memset(ch,0,100);//将100个空间全设置为0;
fread(ch,1,100,pFile);
*/
//第三种方法,获取文件的大小
char *pBuf;
fseek(pFile,0,SEEK_END);//先将文件指针移动到最后面;
int len = ftell(pFile);//获取文件的当前位置,即它的长度
pBuf = new char[len+1];//动态申请空间
rewind(pFile);//将文件指针重新放置到文件开始处;
fread(pBuf,1,len,pFile);
pBuf[len] = 0;//注意下班是从0开始的
fclose(pFile);
MessageBox(pBuf);
5.二进制文件和文本文件(两种文件格式)
文件只是计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式;
对于文本文件来说,它只是一种特殊形式的文件,它所存放的每一个字节都可以转换为一个可读的字符;
当按照二进制方式向文件写入数据时,则会将数据在内存中的存储形式原样输出到文件中;
所以写入和读取文件时要保持一致,,如果采用文本方式写入,应采用文本方式读取;如果采用二进制方式写入数据,在读取时也应采用二进制方式;
6.一道面试题:给你一个整数,例如98341,将这个整数保存到文件中,要求以记事本程序打开时,显示的还是98341;
注意:因为对于文本文件来说,它的每一个字节存放的是可表示为一个字符的ASCII代码;
所以不能记事本打开的是相应ASCII字符转换后的字符,在记事本中看到的“98341”是5个字符,并不是整数;
Char ch[5];
Ch[0]=9+48;//字符0的ASCII码是48;
Ch[1]=8+48;
Ch[2]=3+48;
Ch[3]=4+48;
Ch[4]=1+48;
Fwrite(ch,1,5,pFile);
用一个更简单的方法就是:直接利用itoa函数将整数转换为字符串;
Int i=98431;
Charch[5];
Itoa(I,ch,10);
Fwrite(ch,1,5,pFile);
7.另一种面试题:给定一个字符串,其中既有数字字符,又有英文字符等,让你判断哪些是数字字符;
判断方法:对于数字字符,他们的ASCII字符码大小等于48,小于等于57,在此范围之内,就似乎数字字符;
1. C++对文件操作的支持(写)//应用场合比较少
在C++中,向文件写入数据可使用ofstream类来实现;
Ofstream类的构造函数有三个参数,其中后两个参数有默认值;
#include<fstream.h>
Ofstream ofs(“4.txt”);
Ofs.write(http://www.sunxing.org,strlen(http://www.sunxing.org));
Ofs.close();
2. C++对文件操作的支持(读)
#include<fstream.h>
Ifstream ifs(“4.txt”);
Char ch[100];
Memset(ch,0,100);
Ifs.read(ch,100);
Ifs.close();
MessageBox(ch);
3. win32API对文件操作的支持;
对象不设置共享,即表示后续对该对象进行打开操作将会失败,直到关闭句柄为止;
4. 文件的写入
//定义一个句柄变量
HANDLE hFile;
//创建文件
hFile=CreateFile(“5.txt”,GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
//访问方式为GENERIC_WRITE,共享方式为0,不被共享,NULL表示设置为默认安全属性;CREATE_NEW表示创建一个新文件;
//接收实际写入的字节数
DWORD dwWrites;
//写入数据
WriteFile(hFile,http://www.sunxin.org,strlen(“http://www.sunxin.org”),&dwWrites,NULL);
//关闭文件句柄
CloseHandle(hFile);
5. 文件的读取
HANDLEhFile;
//打开文件
hFile=CreateFile("5.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//接受实际读取到的数据
charch[100];
//接收实际读取到的字节数
DWORDdwWrites;
//读取数据
ReadFile(hFile,ch,100,&dwWrites,NULL);
//设置字符串结束字符
ch[dwWrites]=0;
//关闭打开的文件对象的句柄
CloseHandle(hFile);
//显示读取到的数据
MessageBox(ch);
6. MFC对文件操作的支持(提供的基类是:CFile,构造函数就两个参数);
文件的写入:
CFilefile("6.txt",CFile::modeCreate | CFile::modeWrite);
file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
file.Close();
7. 文件的读取:
//首先先构造一个CFile类的文件对象
CFilefile("6.txt",CFile::modeRead);
//利用该类的函数得到文件的长度
DWORDdwFileLen;
dwFileLen=file.GetLength();
//利用这个长度构造存放数据的存放区,注意要多分配一个字节
char*pBuf;
pBuf=newchar[dwFileLen+1];
pBuf[dwFileLen]=0;
file.Read(pBuf,dwFileLen);
file.Close();
MessageBox(pBuf);
8. CFileDialog类:实现“打开文件“和”另存为“对话框的功能;
CFileDialogfileDlg(FALSE);
//第一个参数为TRUE为打开对话框
//为FALSE,保存对话框
//更改对话框标题
fileDlg.m_ofn.lpstrTitle="我的文件保存对话框";
//设置保存类型,设置过滤器,注意最后面必须得是两个\0
fileDlg.m_ofn.lpstrFilter="TextFiles(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
//设置默认的扩展名
fileDlg.m_ofn.lpstrDefExt="txt";
fileDlg.DoModal();
9. 为了获取用户输入的文件名,CFileDialog类提供了两个函数:GetPathName(返回选择文件的完整路径)和GetFileName(只返回文件名)
if(IDOK == fileDlg.DoModal())
{
CFilefile(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);
file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
file.Close();
}
10. 打开文件对话框
CFileDialogfileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle="我的文件打开对话框";
fileDlg.m_ofn.lpstrFilter="TextFiles(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
if(IDOK==fileDlg.DoModal())
{
CFilefile(fileDlg.GetFileName(),CFile::modeRead);
char*pBuf;
DWORDdwFileLen;
dwFileLen=file.GetLength();
pBuf=new char[dwFileLen+1];
pBuf[dwFileLen]=0;
file.Read(pBuf,dwFileLen);
file.Close();
MessageBox(pBuf);
}
11. Win.ini文件
有时候在编写程序时,需要将一些初始化信息写入到一个配置文件中,当程序启动的时候从这个配置文件中读取这些初始化信息;(现在都写入注册表中了,早期的程序才写入Win.ini文件中,这只是为了兼容16位版本的程序)
12. AfxMessageBox来显示消息,是因为CWinApp类并不是从Wnd类派生的,因此它没有MessageBox函数;
13. 往注册表里面写入信息
//先定义一个注册表项句柄变量
HKEYhKey;
//然后创建一个注册表项
//一般向注册表中写入软件信息时,通常都是在HKEY_LOCAL_MACHINE分支下写入的
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",&hKey);
//REG_SZ字符串类型
RegSetValue(hKey,NULL,REG_SZ,"zhangsan",strlen("zhangsan"));
RegCloseKey(hKey);
14. 从注册表里面读出信息
LONGlValue;
//第一次用这个函数得到将要读取的数据的长度
RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",NULL,&lValue);
//然后根据得到的长度来分配获取的数据的内存
char*pBuf=new char[lValue];
RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",pBuf,&lValue);
MessageBox(pBuf);
注意:上面的都是针对字符串类型的数据进行的,其他类型的要用RegSetValueEx函数;