MFC中如何显示一个文件的所有行

How to display all the lines of a file in MFC

所以正如标题所说,我想在编辑框中显示文件的所有内容,但我不知道该怎么做

这是按钮的处理程序,按下它会让用户选择一个文件,其内容应该出现在编辑框中。 问题是它只以某种方式显示第一行

UpdateData(TRUE);
CFileDialog Dlg(TRUE);
int iRet = Dlg.DoModal();
CString StrFileName = Dlg.GetPathName();

if (iRet == IDOK) 
{
        CStdioFile file;
        file.Open(StrFileName, CFile::modeRead | CFile::typeText);

        file.ReadString(m_strEditCtrl);
        file.Close();
        UpdateData(FALSE);
}

到达文件末尾时,return 值为 NULL 或 False。

所以你可以循环每一行。伪代码(未测试。可能有问题。)如下所示。

CString eachString;

while (file.ReadString(eachString))
{
    m_strEditCtrl += eachString;

    //The CString version of this function removes the '\n' if present; the LPTSTR version does not.

    m_strEditCtrl += "\n";
}

不要将 MFC 用于您的应用程序需求,仅将其用作 UI。您的所有代码都应该以可移植的方式编写。恕我直言。

根据您的需要编写全局的非 MFC 函数。因此,要从文件中获取字符串。

std::string read_file(const std::wstring& filepathname)
{
    std::ifstream is(filepathname, std::ios::binary | std::ios::ate);
    auto buf_size = is.tellg();
    if (buf_size == -1)
        return std::string();

    std::string str;
    str.resize(buf_size);
    is.seekg(0, std::ios::beg);
    is.read(str.data(), str.size());
    return str;
}

现在,对于 CEdit 框的属性,如果要显示以 \r\n 结尾的行,则必须将 Multiline 设置为 true。您可能还想启用 Vertical ScrollHorizontal Scroll.

创建一个control variable并直接用它设置文本。您可以使用向导来做到这一点。使用 UpdateData 几乎总是错误的。它违背了在对话中交换数据的目的。

因此,您已声明:

CEdit cEditCtrl;

你可以:

auto str = read_file("filename.txt");
cEditCtrl.SetWindowText(str.c_str());

现在,我这样做就好像您设置了 multi_byte 而不是 Unicode。我强烈建议,如果没有设置 Uncode,请执行此操作。从经验来看,早做总比晚做容易得多。在那种情况下,如果您读取一个 ASCII 文件,您将拥有一些全局变量,例如:

inline std::wstring to_wide(const char* ps) { return std::wstring(boost::locale::conv::utf_to_utf<wchar_t>(ps)); }
inline std::wstring to_wide(const std::string& str) { return to_wide(str.c_str()); }

您可以使用 std 库而不是 boost 来执行此操作。那么你可以:

cEditCtrl.SetWindowText(to_wide(str).c_str());

我要补充一点,只要你编译 Unicode,你就可以省去那个宏:_T("text") 只写 L"text" 用于文字。