无法追加写入rtf文件,请大家帮忙看看要怎么能实现这个功能?

ymhdyao 2023-05-26 10:01:21

使用StreamOut的方式写rtf文件,

如果不调用这句话(SeekToEnd),每次都是重新写文件,不能追加写入。

如果加入这句话(SeekToEnd),就不写文件了,但文件大小增大很多。

    pFile->SeekToEnd();

 

以下是写文件的相关代码:

BOOL CESSCTermTestDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
	// TODO: 在此添加专用代码和/或调用基类
	CMainFrame *pFrame = (CMainFrame*)AfxGetMainWnd();
 
	CESSCTermTestView *pEditView = (CESSCTermTestView *)pFrame->m_wndSplitter.GetPane(0, 1);
 
	CFile cFile;
	cFile.Open(lpszPathName, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate);
 
	EDITSTREAM es;
 
	es.dwCookie = (DWORD)&cFile;
	es.pfnCallback = StreamOutCallback;
	pEditView->m_richEditCtrl->StreamOut(SF_RTF, es);
 
	SetModifiedFlag(FALSE);
 
	return TRUE;;
}
 
//流出回调函数
DWORD CESSCTermTestDoc::StreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
	CFile* pFile = (CFile*)dwCookie;
	pFile->SeekToEnd();
	pFile->Write(pbBuff, cb);
 
	*pcb = cb;
 
	return 0;
}

 

...全文
149 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-05-26
精选
  • 打赏
  • 举报
回复
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/7951921, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态
于扶摇 2023-05-28
  • 打赏
  • 举报
回复

在使用StreamOut写入RTF文件时,您需要调用SeekToEnd来确保在写入新数据之前将文件指针移动到文件末尾。否则,每次调用StreamOut时,它都会从文件开头重新写入整个文件,而不是追加到现有文件中。

在您的代码中,您在StreamOutCallback函数中调用了SeekToEnd,这会导致每次StreamOut调用都将从头开始写入文件,而不是追加到现有文件中。您需要将此调用删除,或者将StreamOutCallback函数更改为仅写入数据,而不是调用SeekToEnd。

另外,您的代码中使用了CFile类来打开文件。如果您需要在文件中追加数据而不是覆盖现有文件,请使用CFile::modeWrite | CFile::modeAppend模式打开文件。这将确保您可以将数据追加到现有文件的末尾。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧