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

ymhdyao 2023-05-26 09:59:34

使用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;
}

 

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

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

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

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

赵4老师 2023-05-26
  • 打赏
  • 举报
回复

所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。▼ http://bbs.csdn.net/topics/391975224

ymhdyao 2023-05-26
  • 举报
回复
@赵4老师 但是如果文件a很大,会比较慢吧,能直接找到文件a的文件尾部,然后写入呢?
赵4老师 2023-05-26
  • 举报
回复
@ymhdyao 现在固态硬盘读写速度500MB/s

64,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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