VC++(十二)文件和注册表操作

  • 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函数,第一次调用该函数得到将要获取数据的长度,然后动态分配内存,接着再次调用该函数得到数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • 这篇文章几乎几乎原封不动的搬过来了这位博主的内容,作为自己以后查询方便用~ reference:http://bl...
    DeamoV阅读 19,874评论 3 33
  • 一、开始菜单启动目录 “开始——程序——启动菜单“,其中的程序和快捷方式都会在系统启动时自动运行。最常见的启动位置...
    一丶味阅读 1,456评论 0 3
  • 注册表是Windows操作系统的一个核心数据库,记载着机子的硬件信息、系统配置、用户配置等各种“高大上”的数据。对...
    逸之阅读 19,252评论 14 62
  • 自从宝宝出生那一刻起,我的心就像被固定吊在半空一样,一直悬着。每时每刻都在提心吊胆,有时,甚至会怀疑自己是否得...
    望圆阅读 293评论 0 0