我的目標是閱讀位于檔案中的所有文本。出于某種原因,每當我從檔案中讀取并列印結果 (drawText) 時,緩沖區似乎每兩個位置跳過一個字符。HELLO 將成為 HLO,而 SCAVENGER 將成為 SAEGR。
這是用于 Windows API。我想知道 CreateFile() 和 ReadFile() 是否正常以及是否是其他原因導致了問題。
void init(HDC hdc)
{
HANDLE hFile;
LPCSTR fileName = "c:\\Users\\kanaa\\Desktop\\code\\HW2_StarterCode\\words.txt";
hFile = CreateFileA(fileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwFileSize = GetFileSize(hFile, NULL);
DWORD dwBytesRead;
WCHAR* buffer = new WCHAR[dwFileSize / 2 1];
buffer[dwFileSize / 2] = 0;
bool read = ReadFile(hFile, buffer, dwFileSize, &dwBytesRead, NULL);
std::wstring wstr(buffer);
std::string str(wstr.begin(), wstr.end());
delete[] buffer;
CloseHandle(hFile);
if (read) parse(str, hdc);
}
void parse(std::string word, HDC hdc)
{
std::string to = word;
std::wstring wword = std::wstring(to.begin(), to.end());
const WCHAR* wcword = wword.c_str();
Graphics graphics(hdc);
drawText(&graphics, wcword);
}
uj5u.com熱心網友回復:
問題是 WCHAR 緩沖區。以下是更正
CHAR* buffer = new CHAR[dwFileSize/sizeof(char) 1];
bool read = ReadFile(hFile, buffer, dwFileSize, &dwBytesRead, NULL);
buffer[dwBytesRead] = 0;
uj5u.com熱心網友回復:
您正在使用wchar_t[]緩沖區處理檔案資料。 wchar_t在 Windows 上大小為 2 個位元組。所以,在宣告中:
std::string str(wstr.begin(), wstr.end());
您一次遍歷檔案資料 2 個位元組,將每個位元組對解釋為一個wchar_t被截斷為 1-byte的單個位元組char,丟棄另一個位元組。這就是為什么你str最終會跳過所有其他角色。
使用char[]緩沖區處理檔案資料。但是,有更簡單的方法可以將 7/8 位檔案資料讀入std::string.
最后,在此宣告中:
std::wstring wword = std::wstring(to.begin(), to.end());
這不是將 a 轉換std::string為 a的正確方法std::wstring。您所做的就是遍歷chars ,將每個原樣轉換為 2-byte wchar_t。Windows API 期望wchar_t字串以 UTF-16 編碼,您的代碼不會轉換為該格式。您需要使用MultiByteToWideChar()、std::wstring_convert或其他等效的 Unicode 庫呼叫來執行該轉換。在這種情況下,您首先需要知道源檔案的編碼,以便將其正確轉換為 Unicode。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329664.html
上一篇:回傳c型別陣列的迭代器?
下一篇:C :函式指標陣列
