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 Scroll
和 Horizontal 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"
用于文字。
所以正如标题所说,我想在编辑框中显示文件的所有内容,但我不知道该怎么做
这是按钮的处理程序,按下它会让用户选择一个文件,其内容应该出现在编辑框中。 问题是它只以某种方式显示第一行
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 Scroll
和 Horizontal 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"
用于文字。