C++,加载文本的函数忽略最后几行,只有一些 .txt 文件

标签 c++ winapi

我正在按照 TheForger 的 Win API 教程将文本文件加载到编辑控件中。有时整个文件被正确加载,有时它的最后一部分被遗漏,其中“部分”在一种情况下是 2 行半,在另一种情况下是 10 行 o_O 下面是文件的样子:

(我是一名新用户,所以它不允许我发布多个超链接,所以这里是截图所在的画廊:http://nancy.imgur.com/all/ 我指的是它们在画廊中出现的顺序)

遗漏 2.5 行:第二个(阅读在“F”之后的光标处停止)

遗漏 10 行:第四行(也停在 f 之后的光标处)

完整阅读:第一和第三

我尝试改用 fstreams,但遗​​漏了相同的内容(我也无法在编辑控件 =( ) 中显示换行符。知道哪里出了问题吗?

我无法链接到 theForger 的教程,所以这里是函数:

BOOL LoadTextFileToEdit(HWND hEdit, LPCTSTR pszFileName) {
HANDLE hFile;
BOOL bSuccess = FALSE;

hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
    OPEN_EXISTING, 0, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
    DWORD dwFileSize;

    dwFileSize = GetFileSize(hFile, NULL);
    if(dwFileSize != 0xFFFFFFFF)
    {
        LPSTR pszFileText;

        pszFileText = GlobalAlloc(GPTR, dwFileSize + 1);
        if(pszFileText != NULL)
        {
            DWORD dwRead;

            if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
            {
                pszFileText[dwFileSize] = 0; // Add null terminator
                if(SetWindowText(hEdit, pszFileText))
                    bSuccess = TRUE; // It worked!
            }
            GlobalFree(pszFileText);
        }
    }
    CloseHandle(hFile);
}
return bSuccess; }

最佳答案

您的文本文件是否可能包含嵌入的 NUL 字符,因此字符串 pszFileText 比您预期的更早终止? SetWindowText() 函数在遇到第一个 NUL 终止符后停止读取。

此外,当从文件中读取时,您需要检查 dwRead 是否真的是您想要读取的字节数。如果 dwRead 小于 dwFileSize 会怎样?

关于C++,加载文本的函数忽略最后几行,只有一些 .txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423417/

相关文章:

c++ - Windows API 不会退出

c++ - 在 C++ 中使用 fread 从二进制文件中读取字符串及其长度

delphi - 如何检查表单关闭按钮的状态(启用/禁用)

c++ - 当调用原始版本的 DLL Hook 函数时,我得到无限递归

c++ - 为什么 ReadFile() 不返回 0 ?程序试图永远从管道中读取数据

c++ - 什么Alloc API可以在内部调用VirtualAlloc/保留内存?

C++ 字符串 (int) + 字符串 (int)

c++ - "std::cout << std::endl;"如何编译?

c++ - 取消引用时销毁对象

c++ - 在 C++ 中查找大于 4GB 的文件?