VC 从编辑框CEdit或富编辑控件CRichEditCtrl读取大容量文本并写入文件的方法

本文解决编辑框、富编辑控件的内容写入文件时,文本长度太大时写入内容被截断的问题!

读取编辑框内容并写入文件,可能最常用的方法是创建文件,利用GetWindowText, 或GetDlgItemText读取编辑框或富编辑控件(Multiline)的内容到字符串,将字符串buffer写入文件。常见代码如下:
CFile file("temp.txt", CFile::modeReadWrite | CFile::modeCreate|CFile::modeNoTruncate);
CString str;
GetDlgItemText(IDC_EDIT1,str); // 字符串或字符buffer存储上限时3 kB,超过的内容将不会被存储。
file.Write(str, sizeof(str)); // write函数写入的是非NULL终止的数据,会产生乱码。
file.Close();

通过上述常见代码的分析可以看出,当文本长度很大时,问题就会很多。即使在file.Write之前添加str的buffer的终止符('\0'),写入的结果除了截断之外,虽然不会有乱码,但是每个字符后都会加一个空格(项目使用Unicode字符集)。这种现象在file构造函数中加入TypeText及TypeUnicode都不会解决。

正确地从编辑框或富编辑控件读取大容量文本并写入文件的方法是:利用CStdioFile逐行读取文本到字符buffer并写入文件。代码如下:

void CTestDlg::OnClickedBtn1()
{
	// TODO: 在此添加控件通知处理程序代码
	CRichEditCtrl * ped = (CRichEditCtrl*)GetDlgItem(IDC_REDIT1);
	CStdioFile file;
	file.Open(_T("temp.txt"), CFile::modeCreate | CFile::modeWrite);
	int nLineLength, nLineIndex, nLineCount = ped->GetLineCount();
	// Write every line of text of the rich edit control.
	for (int i = 0; i < nLineCount; i++)
	{
		nLineIndex = ped->LineIndex(i);
		nLineLength = ped->LineLength(nLineIndex);
		if (nLineLength > 0)  // Debug assertion failed if a empty string such as '\r\n'.
		{
			// Line text preparation: method - 1
			TCHAR* LineText = new TCHAR[nLineLength + 1];
			ped->GetLine(i, (LPTSTR)LineText, nLineLength + 1);
			LineText[nLineLength] = _T('\0');  // null terminate
			// Line text preparation: method - 2
		//	ped->GetLine(i, str.GetBufferSetLength(nLineLength + 1), nLineLength);
		//	str.SetAt(nLineLength, _T('\0')); // null terminate
			// Write function writes data that is not null-terminated to a file,
			// and is not suitable.
			file.SeekToEnd();
			file.WriteString(LineText);
			file.WriteString(_T("\n"));
			// Release buffer
		//	str.ReleaseBuffer(nLineLength + 1);
			delete[] LineText;
		}
	}
//	file.Write(pstr, textlen);
	file.Flush();
	file.Close();
}

 

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值