const char***
指向常量的指针,不能修改其指向的内存中的内容。但可以修改其所指向的内存地址。指针变量是可以修改的,而其指向的对象被看做是常量,不能够被修改。
定义函数时,如果想利用指针类型来传递参数,通常将形参声明为const char*类型,这样就不能利用形参来修改指针所指向的内容,从而保证了数据的一致性。char* const
指针常量,必须在其定义的同时赋值。指针常量表示指针本身是常量。其值不能修改。但其所指向的内容是可以修改的。C语言对文件操作的支持
文件的打开
FILE *fopen(const char *filename,const char *type);
文件的写入
size_t fwrite(
const void *buffer,
size_t size,
size_t count,
FILE *stream
);
int main()
{
FILE *pFile = fopen("1.txt","w");
fwrite("hello,world!",1,strlen("hello,world!"),pFile);
return 0;
}
执行完pFile后,产生一个名为“1.txt”的文件(大小为0)
执行完fwrite后,大小还是为0
当程序完全运行完以后,hello,world!才会被写入文件。
C语言对文件的操作使用了缓冲文件系统:为每个正在使用的文件开辟了一段内存(缓冲区域),当我们向硬盘上写数据时,是先写到内存里的(缓冲区域),直到内存(缓冲区域)满了,或者是我们通知系统要关闭这个文件了,才把内存里的数据拷贝到硬盘上。why?因为内存之间的操作速度要远远快于内存到硬盘的速度。
文件的关闭
int fclose(FILE *stream);
fflush()
The fflush function flushes a stream. If the file associated with stream is open for output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer. fflush negates the effect of any prior call to ungetc against stream. Also, fflush(NULL) flushes all streams opened for output. The stream remains open after the call. fflush has no effect on an unbuffered stream.
将ch数组全部设置为0
char ch[100]
memset(ch,0,100)
void rewind(
FILE *stream
);
Repositions the file pointer to the beginning of a file.
以文本方式和二进制方式读取文件是有明显的区别的
当按照文本方式向文件中写入数据时,一旦遇到换行符(ASCII码为10),则会转换为回车-换行(ASCII码分别为13,10)。
读取文件时,一旦遇到回车-换行的组合(连续的ASCII码为13,10),则会转换为换行字符。
当按照二进制方式向文件中写入数据时,则会将数据在内存中的存储形式原样输出到文件中。
基于Intel的机器在存储器中按照从最低字节到最高字节的顺序存储对象。
如果直接以文本的方式写进文件一个整数。则打开是乱码的。
用二进制方式打开可以看见这个整数的16进制字符,4个字节。
因为这四个字节的转换成字符之后是不可读的,因此看到的就是乱码。Win.ini早期的一些程序将初始化信息写入到Win.ini文件中
win.ini,是Windows系统的一个基本系统配置文件。WIN.INI文件包含若干小节,每一节由一组相关的设定组成。文件配保存了诸如影响Windows操作环境的部分、控制系统界面显示形式及窗口和鼠标器的位置、联结特定的文件类型与相应的应用程序、列出有关HELP窗口及对话窗的默认尺寸、布局、文本颜色设置等等的选项。是系统配置不可缺少的文件。注册表的编程
注册表存储在二进制文件中。
注册表是Windows操作系统的核心数据库,存放着各种参数,直接控制着Windows的启动、硬件驱动程序的装载以及一些Windows应用程序的运行。可以说是Windows的神经中枢。在Windows 3.x操作系统中,注册表是一个极小文件,其文件名为Reg.dat,里面只存放了某些文件类型的应用程序关联,大部分的设置放在Win.ini、System.ini等多个初始化INI文件中。由于这些初始化文件不便于管理和维护,时常出现一些因INI文件遭到破坏而导致系统无法的启动的问题。为了使系统运行得更为稳定、健壮,Windows 95/98设计师们借用了Windows NT中的注册表的思想,将注册表引入到Windows 95/98操作系统中,而且将INI文件中的大部分设置也移植到注册表中,因此,注册表在Windows 95/98操作系统的启动、运行过程中起着重要的作用。
注册表顾名思义是注册文件,当你在电脑里进行某一操作的时候,都会写入注册表,用以记录.它还有作用就是控制硬件软件等,比如你可以在注册表里调整BIOS和 2级缓存,修改参数等
注册表的结构划分及相互关系
注册表的根键共六个。这些根键都是大写的,并以HKEY_为前缀;这种命令约定是以Win32 API的Registry函数的关键字的符号变量为基础的。
HKEY_CLASSES_ROOT和HKEY_CURRENT_CONFIG中存放的信息都是HKEY_LOCAL_MACHINE中存放的信息的一部分。
而HKEY_CURRENT_USER中存放的信息只是HKEY_USERS存放的信息的一部分。
HKEY_LOCAL_MACHINE包括HKEY_CLASSES_ROOT和HKEY_CURRENT_USER中所有的信息。在每次系统启动后,系统就映射出HKEY_CURRENT_USER中的信息,使得用户可以查看和编辑其中的信息。
实际上,HKEY_LOCAL_MACHINE\SOFTWARE\Classes就是HKEY_CLASSES_ROOT,为了用户便于查看和编辑,系统专门把它作为一个根键。同理,HKEY_CURRENT_CONFIG\SY-STEM\Current Control就是HKEY_LOCAL_MACHINE\SYSTEM\Current Control。
HKEY_USERS中保存了默认用户和当前登录用户的用户信息。HKEY_CURRENT_USER中保存了当前登录用户的用户信息。
HKEY_DYN_DATA保存了系统运行时的动态数据,它反映出系统的当前状态,在每次运行时都是不一样的,即便是在同一台机器上。
根据上面的分析,注册表中的信息可以分为HKEY_LOCAL_MACHINE和HKEY_USERS两大类,这两大类的详细内容请看后面的介绍。
1.HKEY_USERS
该根键保存了存放在本地计算机口令列表中的用户标识和密码列表。每个用户的预配置信息都存储在HKEY_USERS根键中。HKEY_USERS是远程计算机中访问的根键之一。
2.HKEY_CURRENT_USER
该根键包含本地工作站中存放的当前登录的用户信息,包括用户登录用户名和暂存的密码(注:此密码在输入时是隐藏的)。用户登录Windows 98时,其信息从HKEY_USERS中相应的项拷贝到HKEY_CURRENT_USER中。
3.HKEY_CURRENT_CONFIG
该根键存放着定义当前用户桌面配置(如显示器等)的数据,最后使用的文档列表(MRU)和其他有关当前用户的Windows 98中文版的安装的信息。
4.HKEY_CLASSES_ROOT
根据在Windows 98中文版中安装的应用程序的扩展名,该根键指明其文件类型的名称。
在第一次安装Windows 98中文版时,RTF(Rich Text format)文件与写字板(WordPad)&127;联系起来,但在以后安装了中文Word 6.0后,双击一个RTF文件时,将自动激活Word。存放在SYSTEM.DAT中的HKEY_CLASSES_ROOT,将替代WIN.INI文件中的[Extensions]&127;小节中的设置项,它把应用程序与文件扩展名联系起来,它也替代了Windows 3.x中的Reg.dat文件中的相似的设置项。
5.HKEY_LOCAL_MACHINE
该根键存放本地计算机硬件数据,此根键下的子关键字包括在SYSTEM.DAT中,用来提供HKEY_LOCAL_MACHINE所需的信息,或者在远程计算机中可访问的一组键中。
6.HKEY_DYN_DATA
该根键存放了系统在运行时动态数据,此数据在每次显示时都是变化的,因此,此根键下的信息没有放在注册表中。
- 注册表访问示例
//写注册表操作
void CFileView::OnRegWrite()
{
// TODO: Add your command handler code here
HKEY hKey;
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",&hKey);
RegSetValue(hKey,NULL,REG_SZ,"zhangsan",strlen("zhangsan"));
DWORD dwAge=30;
RegSetValueEx(hKey,"age",0,REG_DWORD,(CONST BYTE*)&dwAge,4);
RegCloseKey(hKey);
}
在向注册表中写入软件信息时,通常都是在HKEY_LOCAL_MACHINE分支下写入的。
DWORD类型。每个Word为两个字节的长度,DWORD双字即4个字节。
LONG类型。有符号32位整数。
void CFileView::OnRegRead()
{
// TODO: Add your command handler code here
LONG lValue;
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);
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE,
"Software\\http://www.sunxin.org\\admin",&hKey);
DWORD dwType;
DWORD dwValue;
DWORD dwAge;
RegQueryValueEx(hKey,"age",0,&dwType,(LPBYTE)&dwAge,&dwValue);
CString str;
str.Format("age=%d",dwAge);
MessageBox(str);
}
如果在调用RegQueryValue函数时,将其第三个参数设置为NULL,第四个参数设置为非NULL,那么该函数将返回存储数据的大小。这样,可以让应用程序确定一个最佳的方式来存储将要获取到的数据,然后再去获取数据,也就是说,程序可以根据该函数此时返回的数据长度动态分配一块内存,用来保存将要获取的数据的大小,即,就可以采用这种方式,依次调用两次RegQueryValue函数,第一次调用该函数得到将要获取数据的长度,然后动态分配内存,接着再次调用该函数得到数据。