簡體   English   中英

使用Write成員將CString寫入CFile時,每個字符后均為Null

[英]Nulls after each character when writing CString to CFile using Write member

我目前正在研究MFC庫CFile類,並且在使用Write方法將數據寫入文件時遇到問題。 當我將char數組作為參數傳遞時,它可以正常工作:

char c[] = "Hello!"; 
int size = sizeof(c) / sizeof(c[0]);
myFile.Write(c, size)

寫入文件的字符:

Hello!

但是,當我嘗試將CS​​tring對象作為參數傳遞時:

CString cS("Hello");
myFile.Write(cS, cS.GetLength());

我得到:

H e l

我也嘗試過:

CString cS("Hello");
LPWSTR c = cS.GetBuffer();
myFile.Write(c, cS.GetLength());
cS.ReleaseBuffer();

但是輸出與上面相同。 是什么原因導致轉換? 是否因為文本以寬字符存儲而發生?

問題:

CFile :: Write的第二個參數是函數將從第一個參數(緩沖區)傳輸的字節數。 您正在傳遞cS.GetLength() ,它更願意傳遞字符串中的字符數,這與字符串本身可能組成的字節數不同。

解:

您應該將將字符串寫入文件的行更改為如下所示:

myFile.Write(LPCTSTR(cS), cS.GetLength()*sizeof(TCHAR));

如果您要為Unicode或MBCS構建, sizeof(TCHAR)將產生不同的數字。 這是因為對於Unicode構建, TCHAR被定義為wchar_t ,對於MBCS構建, TCHAR被定義為char 因此,將字符串的長度乘以TCHAR的大小將始終等於組成字符串的字節數,而不管是否要為Unicode構建。

其他注意事項:

您沒有理由在這里調用GetBuffer()ReleaseBuffer()

這一點不是主要問題,但是CFile::Write函數將const void *作為其第一個參數。 因此,您應該將CString強制轉換為LPCTSTR (如果您使用Unicode或MBCS構建,它將自動評估為LPCWSTRLPCSTR )。

最后一件事:用_T()宏包裝字符串文字是很好的,這樣您就可以像Unicode和MBCS一樣進行編譯,而不必更改代碼。

應用所有更改,您的整個代碼將如下所示:

CString cS(_T("Hello"));
myFile.Write(LPCTSTR(cS), cS.GetLength()*sizeof(TCHAR));

那是因為您正在使用定義的UNICODE編譯,並且CString是一串寬字符,每個字符占用兩個字節。 寫入文件的是字符字節,后跟零字節。

我已經在MFC,Visual C ++ 6.0到Visual C ++ 2005的開發領域進行了大約4年的專業開發,以支持我們公司的應用程序。

根據我的經驗以及對CString類對象的了解,它們始終以NULL終止。 與使用字符數組相比,這可能導致不同的行為,但這不是上面的問題。

我相信您的問題與作為參數傳遞的緩沖區有關。 LPWSTR是此MSDN Reference指向一個16位字符的字符串的32位指針。

根據我發布的內容,您正在輸出16位Unicode字符,並將其視為ANSI因此可以預期會出現這種情況。 如果要以Unicode打開記事本文件,則不會看到空格。

另外,如果您使用ANSI字符集構建項目,或者在寫入文件之前轉換為ANSI ,則在記事本中打開輸出時,空格應消失。

嘗試這個

TCHAR c[] = "Hello!"; 
int charCount = sizeof(c) / sizeof(c[0]);
myFile.Write(c, charCount*sizeof(c[0]));

寫操作將只寫指定的字節數。 charCount將與ASCII的字節數相同,但將為UNICODE的值的一半。

嘗試為您的文本類型更改以上代碼

https://msdn.microsoft.com/zh-CN/library/6337eske.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM