64,962
社区成员
发帖
与我相关
我的任务
分享
使用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;
}
在使用StreamOut写入RTF文件时,您需要调用SeekToEnd来确保在写入新数据之前将文件指针移动到文件末尾。否则,每次调用StreamOut时,它都会从文件开头重新写入整个文件,而不是追加到现有文件中。
在您的代码中,您在StreamOutCallback函数中调用了SeekToEnd,这会导致每次StreamOut调用都将从头开始写入文件,而不是追加到现有文件中。您需要将此调用删除,或者将StreamOutCallback函数更改为仅写入数据,而不是调用SeekToEnd。
另外,您的代码中使用了CFile类来打开文件。如果您需要在文件中追加数据而不是覆盖现有文件,请使用CFile::modeWrite | CFile::modeAppend模式打开文件。这将确保您可以将数据追加到现有文件的末尾。
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。▼ http://bbs.csdn.net/topics/391975224