![](/img/trans.png)
[英]Is there a way to send a CString to a CFile without writing an actual file?
[英]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!
但是,當我嘗試將CString對象作為參數傳遞時:
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構建,它將自動評估為LPCWSTR
或LPCSTR
)。
最后一件事:用_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的值的一半。
嘗試為您的文本類型更改以上代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.