const char***
指向常量的指針,不能修改其指向的內(nèi)存中的內(nèi)容。但可以修改其所指向的內(nèi)存地址笨忌。指針變量是可以修改的蓝仲,而其指向的對象被看做是常量,不能夠被修改官疲。
定義函數(shù)時袱结,如果想利用指針類型來傳遞參數(shù),通常將形參聲明為const char*類型途凫,這樣就不能利用形參來修改指針所指向的內(nèi)容垢夹,從而保證了數(shù)據(jù)的一致性。char* const
指針常量维费,必須在其定義的同時賦值棚饵。指針常量表示指針本身是常量煤裙。其值不能修改。但其所指向的內(nèi)容是可以修改的噪漾。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;
}
執(zhí)行完pFile后硼砰,產(chǎn)生一個名為“1.txt”的文件(大小為0)
執(zhí)行完fwrite后,大小還是為0
當程序完全運行完以后欣硼,hello,world!才會被寫入文件题翰。
C語言對文件的操作使用了緩沖文件系統(tǒng):為每個正在使用的文件開辟了一段內(nèi)存(緩沖區(qū)域),當我們向硬盤上寫數(shù)據(jù)時诈胜,是先寫到內(nèi)存里的(緩沖區(qū)域)豹障,直到內(nèi)存(緩沖區(qū)域)滿了,或者是我們通知系統(tǒng)要關(guān)閉這個文件了焦匈,才把內(nèi)存里的數(shù)據(jù)拷貝到硬盤上血公。why?因為內(nèi)存之間的操作速度要遠遠快于內(nèi)存到硬盤的速度。
文件的關(guān)閉
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數(shù)組全部設(shè)置為0
char ch[100]
memset(ch,0,100)
void rewind(
FILE *stream
);
Repositions the file pointer to the beginning of a file.
以文本方式和二進制方式讀取文件是有明顯的區(qū)別的
當按照文本方式向文件中寫入數(shù)據(jù)時缓熟,一旦遇到換行符(ASCII碼為10)累魔,則會轉(zhuǎn)換為回車-換行(ASCII碼分別為13,10)。
讀取文件時够滑,一旦遇到回車-換行的組合(連續(xù)的ASCII碼為13,10)垦写,則會轉(zhuǎn)換為換行字符。
當按照二進制方式向文件中寫入數(shù)據(jù)時彰触,則會將數(shù)據(jù)在內(nèi)存中的存儲形式原樣輸出到文件中梯投。
基于Intel的機器在存儲器中按照從最低字節(jié)到最高字節(jié)的順序存儲對象。
如果直接以文本的方式寫進文件一個整數(shù)况毅。則打開是亂碼的分蓖。
用二進制方式打開可以看見這個整數(shù)的16進制字符,4個字節(jié)尔许。
因為這四個字節(jié)的轉(zhuǎn)換成字符之后是不可讀的咆疗,因此看到的就是亂碼。Win.ini早期的一些程序?qū)⒊跏蓟畔懭氲絎in.ini文件中
win.ini母债,是Windows系統(tǒng)的一個基本系統(tǒng)配置文件。WIN.INI文件包含若干小節(jié)尝抖,每一節(jié)由一組相關(guān)的設(shè)定組成毡们。文件配保存了諸如影響Windows操作環(huán)境的部分、控制系統(tǒng)界面顯示形式及窗口和鼠標器的位置昧辽、聯(lián)結(jié)特定的文件類型與相應(yīng)的應(yīng)用程序衙熔、列出有關(guān)HELP窗口及對話窗的默認尺寸、布局搅荞、文本顏色設(shè)置等等的選項红氯。是系統(tǒng)配置不可缺少的文件框咙。注冊表的編程
注冊表存儲在二進制文件中。
注冊表是Windows操作系統(tǒng)的核心數(shù)據(jù)庫痢甘,存放著各種參數(shù)喇嘱,直接控制著Windows的啟動、硬件驅(qū)動程序的裝載以及一些Windows應(yīng)用程序的運行塞栅≌咄可以說是Windows的神經(jīng)中樞。在Windows 3.x操作系統(tǒng)中放椰,注冊表是一個極小文件作烟,其文件名為Reg.dat,里面只存放了某些文件類型的應(yīng)用程序關(guān)聯(lián)砾医,大部分的設(shè)置放在Win.ini拿撩、System.ini等多個初始化INI文件中。由于這些初始化文件不便于管理和維護如蚜,時常出現(xiàn)一些因INI文件遭到破壞而導(dǎo)致系統(tǒng)無法的啟動的問題压恒。為了使系統(tǒng)運行得更為穩(wěn)定、健壯怖亭,Windows 95/98設(shè)計師們借用了Windows NT中的注冊表的思想涎显,將注冊表引入到Windows 95/98操作系統(tǒng)中,而且將INI文件中的大部分設(shè)置也移植到注冊表中兴猩,因此期吓,注冊表在Windows 95/98操作系統(tǒng)的啟動、運行過程中起著重要的作用倾芝。
注冊表顧名思義是注冊文件,當你在電腦里進行某一操作的時候,都會寫入注冊表,用以記錄.它還有作用就是控制硬件軟件等,比如你可以在注冊表里調(diào)整BIOS和 2級緩存,修改參數(shù)等
注冊表的結(jié)構(gòu)劃分及相互關(guān)系
注冊表的根鍵共六個讨勤。這些根鍵都是大寫的,并以HKEY_為前綴;這種命令約定是以Win32 API的Registry函數(shù)的關(guān)鍵字的符號變量為基礎(chǔ)的。
HKEY_CLASSES_ROOT和HKEY_CURRENT_CONFIG中存放的信息都是HKEY_LOCAL_MACHINE中存放的信息的一部分晨另。
而HKEY_CURRENT_USER中存放的信息只是HKEY_USERS存放的信息的一部分潭千。
HKEY_LOCAL_MACHINE包括HKEY_CLASSES_ROOT和HKEY_CURRENT_USER中所有的信息。在每次系統(tǒng)啟動后借尿,系統(tǒng)就映射出HKEY_CURRENT_USER中的信息刨晴,使得用戶可以查看和編輯其中的信息。
實際上路翻,HKEY_LOCAL_MACHINE\SOFTWARE\Classes就是HKEY_CLASSES_ROOT狈癞,為了用戶便于查看和編輯,系統(tǒng)專門把它作為一個根鍵茂契。同理蝶桶,HKEY_CURRENT_CONFIG\SY-STEM\Current Control就是HKEY_LOCAL_MACHINE\SYSTEM\Current Control。
HKEY_USERS中保存了默認用戶和當前登錄用戶的用戶信息掉冶。HKEY_CURRENT_USER中保存了當前登錄用戶的用戶信息真竖。
HKEY_DYN_DATA保存了系統(tǒng)運行時的動態(tài)數(shù)據(jù)脐雪,它反映出系統(tǒng)的當前狀態(tài),在每次運行時都是不一樣的恢共,即便是在同一臺機器上战秋。
根據(jù)上面的分析,注冊表中的信息可以分為HKEY_LOCAL_MACHINE和HKEY_USERS兩大類旁振,這兩大類的詳細內(nèi)容請看后面的介紹获询。
1.HKEY_USERS
該根鍵保存了存放在本地計算機口令列表中的用戶標識和密碼列表。每個用戶的預(yù)配置信息都存儲在HKEY_USERS根鍵中拐袜。HKEY_USERS是遠程計算機中訪問的根鍵之一吉嚣。
2.HKEY_CURRENT_USER
該根鍵包含本地工作站中存放的當前登錄的用戶信息,包括用戶登錄用戶名和暫存的密碼(注:此密碼在輸入時是隱藏的)。用戶登錄Windows 98時蹬铺,其信息從HKEY_USERS中相應(yīng)的項拷貝到HKEY_CURRENT_USER中尝哆。
3.HKEY_CURRENT_CONFIG
該根鍵存放著定義當前用戶桌面配置(如顯示器等)的數(shù)據(jù),最后使用的文檔列表(MRU)和其他有關(guān)當前用戶的Windows 98中文版的安裝的信息。
4.HKEY_CLASSES_ROOT
根據(jù)在Windows 98中文版中安裝的應(yīng)用程序的擴展名,該根鍵指明其文件類型的名稱甜攀。
在第一次安裝Windows 98中文版時,RTF(Rich Text format)文件與寫字板(WordPad)&127;聯(lián)系起來,但在以后安裝了中文Word 6.0后秋泄,雙擊一個RTF文件時,將自動激活Word规阀。存放在SYSTEM.DAT中的HKEY_CLASSES_ROOT恒序,將替代WIN.INI文件中的[Extensions]&127;小節(jié)中的設(shè)置項,它把應(yīng)用程序與文件擴展名聯(lián)系起來,它也替代了Windows 3.x中的Reg.dat文件中的相似的設(shè)置項。
5.HKEY_LOCAL_MACHINE
該根鍵存放本地計算機硬件數(shù)據(jù),此根鍵下的子關(guān)鍵字包括在SYSTEM.DAT中,用來提供HKEY_LOCAL_MACHINE所需的信息,或者在遠程計算機中可訪問的一組鍵中谁撼。
6.HKEY_DYN_DATA
該根鍵存放了系統(tǒng)在運行時動態(tài)數(shù)據(jù)歧胁,此數(shù)據(jù)在每次顯示時都是變化的,因此厉碟,此根鍵下的信息沒有放在注冊表中喊巍。
- 注冊表訪問示例
//寫注冊表操作
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為兩個字節(jié)的長度,DWORD雙字即4個字節(jié)款咖。
LONG類型何暮。有符號32位整數(shù)。
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);
}
如果在調(diào)用RegQueryValue函數(shù)時铐殃,將其第三個參數(shù)設(shè)置為NULL海洼,第四個參數(shù)設(shè)置為非NULL,那么該函數(shù)將返回存儲數(shù)據(jù)的大小背稼。這樣,可以讓應(yīng)用程序確定一個最佳的方式來存儲將要獲取到的數(shù)據(jù)玻蝌,然后再去獲取數(shù)據(jù)蟹肘,也就是說词疼,程序可以根據(jù)該函數(shù)此時返回的數(shù)據(jù)長度動態(tài)分配一塊內(nèi)存,用來保存將要獲取的數(shù)據(jù)的大小帘腹,即贰盗,就可以采用這種方式,依次調(diào)用兩次RegQueryValue函數(shù)阳欲,第一次調(diào)用該函數(shù)得到將要獲取數(shù)據(jù)的長度舵盈,然后動態(tài)分配內(nèi)存,接著再次調(diào)用該函數(shù)得到數(shù)據(jù)球化。