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

2016-11-21  本文已影响0人  侧漏的少年
文件的打开
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),则会转换为换行字符。

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

上一篇 下一篇

猜你喜欢

热点阅读