1. 程式人生 > >CString與Char*的轉換,以及中文字元寫入檔案,檔案的讀寫等

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里加以處理。具體怎麼處理,就看你檔案怎麼儲存的,你要怎麼用了。