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

BWH*_*zel 2 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);
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!???????或者视觉变化,但基本上是"垃圾"!

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

Who*_*aig 5

好吧,我开始发表评论,但它失控了.

写作

这个:

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;当你完成它之后,我会假装你.如果没有,那就这样做.