《VC++深入详解–学习笔记》(12)文件和注册表操作

Filed Under (VC++ 学习笔记) by panmaoru on 16-12-2009

很多与文件操作相关的函数其参数类型都是const char*,本章首先介绍指向常量的指针const char*和指针常量char *const这两种类型的区别。

12.1char const * 和char * const

char const * p;
const char * p;
char * const p;

这三个有什么不同?const char * p;和char const * p;在实现上都是一样的,定义一个指向常量的指针,由于指针指向的是一个常量,常量的值不能改变,但是可以改变指针的指向。char * const p;这是一个指针常量,也就是指针的指向不能改变,但是可以改变指针指向的值。区别指针常量和常量指针的关键看const 和* 的位置。

12.2C语言对文件操作的支持

C语言中,对文件的操作是利用FILE结构体实现的。

12.2.1文件的打开

MSDN中有一个fopen函数:

FILE *fopen( const char *filename, const char *mode );

其中的第一个参数是要打开的文件名称,第二个参数是打开的模式。MSDN中对打开文件的模式进行了如下的定义:

r 为读取而打开,如果文件不存在或者不能找到,函数调用失败
w 为写入文件而打开一个空文件,如果文件已经存在,怎清空内容
a 为写入打开一个文件,如果文件存在,则在尾部添加新数据,在写入之前,不会清除文件中已经有的EOF标记,如果文件不存在,新建一个文件
r+ 打开文档用户写入操作和读取操作,文件必须存在
w+ 为写入操作和读取操作打开一个空的文件,如果给定的文件已经存在,则清空内容
a+ 打开文件用于读取和添加操作,在写入之前移除文件已有的EOF标记,写入之后再恢复EOF标记,如果指定文件不存在,那么先创建这个文件

打开一个文件的实例代码如下:

FILE *pFile=fopen(“1.txt”,”w”);//该操作返回一个FILE类型的指针

12.2.2文件的写入

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

文件写入有四个参数,分别表示:要写入的数据,以字节为单位的项的大小,写入项的最大数目,指向FILE类型的指针,该参数可以由fopen函数获取到,也就是fopen函数的返回值。写入文件的实例代码如下:

fwrite("new buffer",1,strlen("new buffer"),pFile);

由于C语言对文件操作采用缓存文件系统,从内存从磁盘写入的文件首先会被放到内存缓冲区中,只有当内存缓冲区满了或者当写入操作的文件关闭之后,才把要写入的数据存的磁盘文件上。如果要在执行写操作之后立即将数据存放到磁盘文件上,可以先调用fflush函数刷新缓冲区或者调用fclose函数将打开的文件关闭。

12.2.3文件指针的定位

int fseek( FILE *stream, long offset, int origin );

该函数的第三个参数有三种默认的值,SEEK_CUR,SEEK_END,SEEK_SET,实际上是三个宏定义值,在STDIO.h文件中可以看到它们的值分别是1,2,0。分别表示定位到文件的当前位置,结束位置和开始位置。

fseek(pFile,0,SEEK_SET);
fwrite("haha",1,strlen("haha"),pFile);

将指针定位到已经打开的文件的其实位置,并写入新的数据。完成此操作时候会发现文件中起始位置的四个字符已经被替换掉了。尝试了下改变文件的打开模式,但是都不能实现a+b的效果。

12.2.3文件的读取

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

由于C语言中字符串是以”\0”符号结束的。在显示字符串的时候,系统会寻找”\0”字符,因此在写入数据的时候需要在结尾添加一个”\0”,在读取数据的时候,可以动态创建一个数据长度+1的字符数组,然后将最后一个元素设置为”\0”。

写入文件时:

void CFileView::OnFileRead()
{
       // TODO: Add your command handler code here
       FILE *pFile=fopen("1.txt","w");
       //fwrite("new buffer",1,strlen("new buffer"),pFile);
       char buf[22]="www.colsir.com";
       buf[21]='\0';
       fwrite(buf,1,22,pFile);
       fclose(pFile);
}

读取文件时:

void CFileView::OnFileWrite()
{
       // TODO: Add your command handler code here
       FILE *pFile=fopen("1.txt","r");
       char *pbuf;
       fseek(pFile,0,SEEK_END); //为了获取数据的长度,将指针指向文件的末尾
       int len=ftell(pFile);
       pbuf =new char[len+1];
       //rewind(pFile); //下同fseek(pFile,0,SEEK_SET);
       fseek(pFile,0,SEEK_SET); //读取数据前,需要将指针再指回起始位置
       fread(pbuf,1,len,pFile);
       pbuf [len]='\0';
       fclose(pFile);
       MessageBox(pbuf);
}

12.2.3二进制文件和文本文件

字太多,有点啰嗦,不写了,慢慢体会。

12.3C++对文件操作的支持

void CFileView::OnFileWrite()//写入
{
       ofstream ofs("3.txt");
       ofs.write("www.colsir.com",strlen("www.colsir.com"));
       ofs.close();
}
void CFileView::OnFileRead() //读取
{
       // TODO: Add your command handler code here
       ifstream ifs("3.txt");
       char buf[100];
       memset(buf,0,100);
       ifs.read(buf,100);
       ifs.close();
       MessageBox(buf);
}

12.4Win32 API对文件操作的支持

void CFileView::OnFileWrite()//写入
{
       HANDLE hFile;
       hFile=CreateFile("4.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
       DWORD dwWrites;
       WriteFile(hFile,"www.colsir.com",strlen("www.colsir.com"),&dwWrites,NULL);
       CloseHandle(hFile);
}
void CFileView::OnFileRead()//读取
{
       // TODO: Add your command handler code here
       HANDLE hFile;
       hFile=CreateFile("4.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
       char buf[100];
       DWORD dwWrites;
       ReadFile(hFile,buf,100,&dwWrites,NULL);
       buf[dwWrites]=0;
       CloseHandle(hFile);
       MessageBox(buf);
}

12.5MFC对文件操作的支持

MFC中提供的支持文件操作的基类是:CFile,该类提供了没有缓存的二进制格式的磁盘文件输入输出功能,通过其派生类能够间接的支持文本文件和内存文件。

利用MFC的CFile类实现文件写入操作:

void CFileView::OnFileWrite()
{
       CFile file("5.txt",CFile::modeCreate|CFile::modeWrite);
       file.Write("www.colsir.com",strlen("www.colsir.com"));
       file.Close();
}

利用MFC的CFile类实现文件读取操作:

void CFileView::OnFileRead()
{
       CFile file("5.txt",CFile::modeRead);
       char *pBuf;
       DWORD dwFileLen;
       dwFileLen=file.GetLength();
       pBuf=new char[dwFileLen+1];
       pBuf[dwFileLen]=0;
       file.Read(pBuf,dwFileLen);
       file.Close();
       MessageBox(pBuf);
}

12.5注册表操作

注册表存储在二进制文件中,Win32 API提供了大量的函数以便应用程序访问注册表。

1、  创建键:RegCreateKey

2、  打开键:RegOpenKey

3、  写入注册表:RegSetValue(默认REG_SZ类型),RegSetValueEx(其他类型)

4、  由注册表中读数据:RegQueryValue(默认REG_SZ类型),RegQueryValue Ex(其他类型)

void CFileView::OnRegWrite()
{
       HKEY hKey;
       RegCreateKey(HKEY_LOCAL_MACHINE,"SoftWare\\www.colsir.com\\admin",&hKey);
       RegSetValue(hKey,NULL,REG_SZ,"pan",strlen("pan"));
       RegCloseKey(hKey);
}
void CFileView::OnRegRead()
{
       LONG lValue;
       RegQueryValue(HKEY_LOCAL_MACHINE,"SoftWare\\www.colsir.com\\admin",NULL,&lValue);
       char *pBuf=new char[lValue];
       RegQueryValue(HKEY_LOCAL_MACHINE,"SoftWare\\www.colsir.com\\admin",pBuf,&lValue);
       MessageBox(pBuf);
}

Comments (1)

  1. very important

Post a comment