我正在尝试在Win32中使用简单的文件IO。到目前为止,写入工作正常,但读取不是:尽管它成功读取了内容,但附加的“垃圾”会附加到字符串中。我到目前为止的代码如下。该计划已定义UNICODE
。
写作:
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);
然后使用该字符串设置EDIT控件的文本:
SendMessage(hWndTextBox, WM_SETTEXT, NULL, (LPARAM)lpszText); // SetWindowText() also possible
当读回Hello, World!
时,它会以Hello, World!﷽﷽ꮫꮫꮫꮫﻮ
或者视觉变体的形式回读,但基本上是“垃圾”!
我可能错过了一些相当明显的东西,但我看不到哪里!是否有解决这个问题的方法,如果有,那是什么?
答案 0 :(得分:5)
好的,我是以评论开始的,但它失控了。
写作
此:
WCHAR *lpszText = new WCHAR[dwTextSize];
应该是:
WCHAR *lpszText = new WCHAR[dwTextSize+1];
此:
DeleteObject(hTextFile);
根本不应该。。摆脱它。
当你完成它时,我假设你delete [] lpszText;
。如果没有,就这样做。
阅读
GetFileSize()
的第二个参数不应与返回值的变量相同。对于大文件大小,它是64位值的HIGH 32位。如果您知道文件大小小于4gB,则可以将其保留为NULL,因此请更改:
DWORD dwFileSize = GetFileSize(hTextFile, &dwFileSize);
到此:
DWORD dwFileSize = GetFileSize(hTextFile, NULL);
您必须考虑文件缓冲区的空终止符,因此:
WCHAR *lpszText = new WCHAR[dwFileSize / 2];
应改为:
WCHAR *lpszText = new WCHAR[dwFileSize / 2 + 1];
lpszText[dwFileSize / 2] = 0;
其余的应该按照你希望的那样工作。没有错误检查,这不好,但我看到更糟。和以前一样,当你完成它时,我假设你delete [] lpszText;
。如果没有,就这样做。