我试图在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);
Run Code Online (Sandbox Code Playgroud)
对于此示例,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);
Run Code Online (Sandbox Code Playgroud)
然后使用该字符串设置EDIT控件的文本:
SendMessage(hWndTextBox, WM_SETTEXT, NULL, (LPARAM)lpszText); // SetWindowText() also possible
Run Code Online (Sandbox Code Playgroud)
当Hello, World!读回来的时候,它会回读Hello, World!???????或者视觉变化,但基本上是"垃圾"!
我可能错过了一些相当明显的东西,但我看不到哪里!是否有解决这个问题的方法,如果有,那是什么?
好吧,我开始发表评论,但它失控了.
写作
这个:
WCHAR *lpszText = new WCHAR[dwTextSize];
Run Code Online (Sandbox Code Playgroud)
应该:
WCHAR *lpszText = new WCHAR[dwTextSize+1];
Run Code Online (Sandbox Code Playgroud)
这个:
DeleteObject(hTextFile);
Run Code Online (Sandbox Code Playgroud)
不应该在那里..摆脱它.
delete [] lpszText;当你完成它时,我假设你在某个地方.如果没有,那就这样做.
阅读
第二个参数to GetFileSize()不应与返回值相同.对于大文件大小,它是64位值的HIGH 32位.如果您知道文件大小小于4gB,则可以将其保留为NULL,因此请更改:
DWORD dwFileSize = GetFileSize(hTextFile, &dwFileSize);
Run Code Online (Sandbox Code Playgroud)
对此:
DWORD dwFileSize = GetFileSize(hTextFile, NULL);
Run Code Online (Sandbox Code Playgroud)
您必须考虑文件缓冲区的空终止符,因此:
WCHAR *lpszText = new WCHAR[dwFileSize / 2];
Run Code Online (Sandbox Code Playgroud)
应改为:
WCHAR *lpszText = new WCHAR[dwFileSize / 2 + 1];
lpszText[dwFileSize / 2] = 0;
Run Code Online (Sandbox Code Playgroud)
其余的应该像你希望的那样工作.没有错误检查,这不好,但我看到更糟.和以前一样,delete [] lpszText;当你完成它之后,我会假装你.如果没有,那就这样做.
| 归档时间: |
|
| 查看次数: |
2708 次 |
| 最近记录: |