在Win32中,如何将文本文件成功读入内存?

时间:2013-02-01 16:56:43

标签: winapi

我正在尝试在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!﷽﷽ꮫꮫꮫꮫﻮ或者视觉变体的形式回读,但基本上是“垃圾”!

我可能错过了一些相当明显的东西,但我看不到哪里!是否有解决这个问题的方法,如果有,那是什么?

1 个答案:

答案 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;。如果没有,就这样做。