Windows Mobile檔案操作及字符集解析

2021-05-22 17:20:21 字數 3359 閱讀 9698

這週的任務很簡單,就是將乙個大的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...