我想在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