我想在Win32中獲得簡單的文件IO。到目前爲止,寫入工作正常,但讀取不成功:雖然它成功讀取內容,但額外的「垃圾」被附加到字符串。我到目前爲止的代碼如下。該程序已定義UNICODE
。在Win32中,如何將文本文件成功讀入內存?
對於寫作:
DWORD dwTextSize = GetWindowTextLength(hWndTextBox);
WCHAR *lpszText = new WCHAR[dwTextSize];
GetWindowText(hWndTextBox, lpszText, dwTextSize + 1);
hTextFile = CreateFile(lpszTextFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten;
WriteFile(hTextFile, lpszText, 2 * dwTextSize, &dwBytesWritten, NULL); // x2 for 2 bytes per Unicode character
CloseHandle(hTextFile);
DeleteObject(hTextFile);
在這個例子中,Hello, World!
成功保存爲Hello, World!
。
對於閱讀:
lpszTextFileName = L"text.txt"; // LPCTSTR Variable
hTextFile = CreateFile(lpszTextFileName, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwFileSize = GetFileSize(hTextFile, &dwFileSize);
DWORD dwBytesRead;
WCHAR *lpszText = new WCHAR[dwFileSize/2];
ReadFile(hTextFile, lpszText, dwFileSize, &dwBytesRead, NULL);
CloseHandle(hTextFile);
字符串然後用於設置編輯控件的文本:
SendMessage(hWndTextBox, WM_SETTEXT, NULL, (LPARAM)lpszText); // SetWindowText() also possible
當Hello, World!
在讀回時,它讀取回作爲Hello, World!﷽﷽ꮫꮫꮫꮫﻮ
或視覺上的變化,但基本上「垃圾」!
我可能錯過了一些相當明顯的東西,但我看不到它在哪!有沒有解決這個問題的辦法,如果是的話,那是什麼?
在將它發送到SendMessage()之前,終止該字符串(並確保爲該終止符分配空間)。 (如果不是很明顯,那麼在完成時刪除緩衝區)。此外,將GetWindowText(hWndTextBox,lpszText,dwTextSize + 1)'放入前一行分配爲'dwTextSize'的緩衝區可能不是一個明智的想法。 – WhozCraig
如何在Win32中終止一個字符串?它是否就像'lpszText [sizeof(lpszText) - 1] =(WCHAR)0; //或'\ 0''? – BWHazel
這將設置您的字符串中的第3個(或第7個,如果編譯64位)wchar爲0,這不是您想要的。 'sizeof(pointer-type-var)'與sizeof(array-type-var)'不一樣。查看下面的帖子,瞭解如何終止你的字符串。 – WhozCraig