CString與Char*的轉換,以及中文字元寫入檔案,檔案的讀寫等
工作需要,碰到多個檔案讀取和型別轉換的問題,記錄下來。
ps:都是網上搜集來的,只是查的太多,找不到具體連結了,只好不列出處。再次感謝!
1、CString與char*的轉換
分兩種情況,一種是工程設定的是不使用Unicode編碼,這樣的比較簡單,用(LPSTR)(LPCTSTR)str 這樣的就可以。另一種是使用Unicode編碼,這樣就比較麻煩,具體原理沒去搞,能使用就行。
這樣情況下,使用如下辦法:
CString fileName;
char buf[1024] = {'\0'}; WideCharToMultiByte(CP_ACP,0,fileName.GetBuffer(0),fileName.GetLength(),buf,1024,0,0);
然後就轉成了char*的buf了
2、CString與Tchar的轉換
CString str;
Tchar* name[30];
lstrcpy(name, str.GetBuffer(str.GetLength()));
str.ReleaseBuffer();
注意使用了GetBuffer,要用ReleaseBuffer!
或者:
TCHAR* file[300] = L"";
CString str;
_tcscpy_s(file,str);
3、漢字字元儲存到檔案
好像是因為Unicode的原因, 漢字的2字元,英文是1字元,所以漢字字元直接儲存就成亂碼了。
有人提供了一個即能儲存漢字的也能儲存英文的,試了一下,很不錯,如下:
bool writeTextToFile(CString strText,FILE *pFile)
{
if(strText!=_T(""))
{
// strText=_T("如果是中文呢?");
int len=strText.GetLength();
char g_str[256];
if(((unsigned char)strText[0])> 128)
{ //chinese中文
setlocale(0,"chs");
_ftprintf(pFile,_T("%s"),(LPCTSTR)strText);
fprintf_s(pFile,"\n");
}
else
{//英文
for(int m=0;m<len;m++)
{
g_str[m]=strText[m];
}
g_str[len+1]='\0';
fwrite(g_str,sizeof(char)*len,1,pFile);
fprintf_s(pFile,"\n");
}
}
else
{
return false;
}
return true;
}
//////////////////////////////////////PS//////////////////////////////////
上面的似乎有問題!!
在Unicode編碼下,可以這麼讀寫
CString str = _T("史蒂芬-dfew-而我認為");
int ll = str.GetLength();
int dataLength = 1574646343;
#define char_width 2
int char_length = sizeof(TCHAR);
FILE* fp = fopen("1","wb");
fwrite(str.GetBuffer(0),1,ll*char_width + char_width,fp);
fwrite(&dataLength,1,sizeof(int),fp);
fclose(fp);
fp = fopen("1","rb");
TCHAR buf[1024];
int ddddd = 0;
fread(buf,1,(ll+1)*char_width,fp);
fread(&ddddd,1,sizeof(int),fp);
fclose(fp);
CString ss;
ss.Format(L"%s",buf);
4、檔案結尾的判斷問題
可參考http://blog.csdn.net/bingqing07/article/details/5785080的說明,已經明確了
我自己實際碰到的情況是:
我的二進位制流檔案,必須明確知道每一位儲存的內容是什麼,裡面有漢字、數字、影象畫素值等,讀錯一位就全錯了。而且,我是用一個switch來判斷具體要讀什麼,讀多少的。
一開始我用feof來判斷是否結束,可是除錯的時候總是發現,按理到了檔案尾,可還是要進switch一次,導致錯誤。看了上面的連結才明白過來, 單純用feof是不對的。
實際上到了檔案尾,feof還是返回的真,只有再讀一個位元組(比如fgetc一下),使用feof才會得到假。就是fread一個檔案得到的東西,會比fwrite寫入的內容多一個位元組。所以,要在switch里加以處理。具體怎麼處理,就看你檔案怎麼儲存的,你要怎麼用了。