這週的任務很簡單,就是將乙個大的ansi格式的檔案,分割成多個unicode格式的小檔案。 但是c++中的檔案操作有很多,本來對檔案操作就不熟悉的我,再加上各種字符集的轉換,真是把我搞得暈頭轉向。現在理順下。
檔案操作
第一種 利用檔案指標
file * pf;
char buffer[255];
pf.open("disk//ruby.txt");//開啟disk下的ruby.txt
fwrite(buffer,size,count,fp);//這樣我們就可以將buffer中的count*size個字元寫到fp所指向的檔案中了
fread(buffer,size,count,fp);//利用fread函式我們可以將fp中的count*size個字元寫到buffer中
fclose(pf);//注意操縱完檔案指標一定要關閉
在這裡,通過pf指標利用fwrite和fread對檔案進行讀寫操作,都是針對字串的,也就是char型的。所以要是我們想讓他相容unicode格式下的寬字元,就要在操作之後,將字元轉換為寬字元。具體轉換方法我們下面再說。
這裡我們可以看到通過pf指標利用fwrite和fread對檔案進行讀寫操作,都是針對字串的,他的好處是可以直接操作寫入和讀出檔案的字元數目。而且我們可以通過fseek函式,方便的更改檔案讀寫的起點。這在使用起來相當方便。而且它的寫入函式可以寫入const v.oid *型別。但是唯一的缺點就是它是針對字串的,所以不能很方便的整行整行的讀寫資料。
第二種 利用檔案流
ifstream in("disk://ruby.txt");//以輸入方式開啟檔案
ofstream out("disk://ruby.txt");//以輸出方式開啟檔案
in<<"i love you";//向檔案寫入字串"i love you"
out>>i;//從檔案輸入乙個整數值。
out.get(str1,127,'a'); //從檔案中讀取字元到字串str1,當遇到字元'a'或讀取了127個字元時終止。
in.put('c');//注意這裡只能put進乙個char型
out.write(str1,strlen(str1));//把字串str1指向的快取寫 num 個字元到檔案中,值得注意的是快取的型別是 unsigned char *
in.read((unsigned char*)buf,sizeof(n));//從檔案中讀取 num 個字元到 buf指向的快取中讀取指定個整數,注意型別轉換
in.close();
out.close();
if(in.eof()) showmessage("已經到達檔案尾!");判斷檔案是否到達結尾。利用.seekg函式可以移動檔案指標。
還有類似的fgets()和fread()可以整行的讀寫。
這裡我們看到流,封裝了很多函式,我們可以很方便的進行資料常量的輸入輸出,但是對於資料變數,我們無法方便的寫入指定型別的字元(除了cha*r和unsigned char *型別)。
第三種 利用檔案控制代碼
handle hfile;
hfile = createfile();
writefile
readfile
這裡都是針對寬字符集的,對於unicode很實用,但是他沒辦法進行檔案讀寫格式,讀寫個數,和讀寫位置的控制。
字符集的轉換
第一 char * 和 wchar*之間的轉換
對於string來說,只要string.c_str就可以取道他的字串的首位址,但要注意這個指標是個const * char型別
(一) char*轉換成wchar*
char * cstr = "北師大dd";
wchar * wstr;
1、求得cstr的字元數(在ansi中1個英文本元佔1個位元組,1個中文字元佔2個位元組)
dword n = multibytetowidechar(cp_oemcp,null,cstr,-1,null,0,null,false);
2、給wstr開闢空間(在unicode中1個英文本元佔2個位元組,1個中文字元佔2個位元組)
wstr = new wchar[n];
3、轉換
multibytetowidechar(cp_oemcp,null,cstr,-1,wstr,n,null,false);
(二)wchar*轉換成char*也是同樣步驟,只是將multibytetowidechar
()換成widechartomultibyte(cp_oemcp,null,c_filename,-1,null,0,null,false)
第二 int 和 string之間的轉換
itoa
第三 字符集ansi和unicode
char 和 wchar函式很相似,但是有不同,要注意區分。
strcpy等是標準ansi函式,有的人愛用_t***x函式,這個問題曾經搞的很混亂。為了統一,有必要把來龍去脈搞清楚。 為了搞清這些函式,就必須理請幾種字元型別的寫法。
char就不用說了,先說一些wchar_t。
wchar_t是unicode字元的資料型別,它實際定義在裡: typedef unsigned short wchar_t;不能使用類似strcpy這樣的ansi c字串函式來處理wchar_t字串,必須使用wcs字首的函式,例如wcscpy。
為了讓編譯器識別unicode字串,必須以在前面加乙個 「l」,
例如: wchar_t *sztest=l"this is a unicode string.";
wchar unicode字元
pwstr 指向unicode字串的指標
pcwstr 指向乙個恆定的unicode字串的指標
對應的ansi資料型別為char,lpstr和lpcstr。
ansi/unicode通用資料型別為tchar,ptstr,lpctstr。
ansi 操作函式以str開頭 strcpy
unicode 操作函式以wcs開頭 wcscpy
mbcs 操作函式以_mbs開頭 _mbscpy
ansi/unicode 操作函式以_tcs開頭 _tcscpy(c執行期庫)
ansi/unicode 操作函式以lstr開頭 lstrcpy(windows函式)
所有新的和未過時的函式在windows2000中都同時擁有ansi和unicode兩個版本。ansi版本函式結尾以a表示;unicode版本函式結尾以w表示。
Windows Mobile中的檔案改變通知
在資源管理器中,刪除乙個檔案,更改乙個資料夾名稱,都能及時重新整理。這是怎麼做到的呢?答案是使用了檔案改變通知。先看乙個結構 typedef struct tagshchangenotifyentry shchangenotifyentry 要接收檔案改變的訊息,我們要使用乙個視窗hwnd,在視窗建...
Windows Mobile中的檔案改變通知
在資源管理器中,刪除乙個檔案,更改乙個資料夾名稱,都能及時重新整理。這是怎麼做到的呢?答案是使用了檔案改變通知。先看乙個結構 typedef struct tagshchangenotifyentry shchangenotifyentry 要接收檔案改變的訊息,我們要使用乙個視窗hwnd,在視窗建...
windows mobile下檔案的壓縮與解壓縮
zlib是用於資料壓縮的函式庫,在windows和linux上都被廣泛應用。當然,windows mobile上也可以順利地使用該函式庫。在vs2005 ecv4.0當然也可以 下新建一測試工程,把上述標頭檔案和庫檔案加入工程。同時,在你需要的地方新增以下 include zlib.h pragma...