VC/MFC 多文档 串行化 Serialize 读取文本文件

hili210 2016-09-21 01:45:05
我新建了一个MFC的多文档工程,View继承CEditView,Doc继承CDocument,现在打开文件默认都是串行化,我想打开.txt或者是一些其他后缀的文本文件需要怎么改

当前的Doc类中的序列化如下,最好是改序列化,我以前做过CRichEditDoc基类的文本操作,是直接将成员变量m_bRTF设为FALSE就好,但是基于CDocument和CEditView的情况应该怎么改


void CXXXDoc::Serialize(CArchive& ar)
{
for (POSITION pos = GetFirstViewPosition(); pos != NULL;)
{
CVisualCoderView* pView = DYNAMIC_DOWNCAST(CVisualCoderView,
GetNextView(pos));

if (pView != NULL)
{
pView->SerializeRaw(ar);
}
}
}
...全文
284 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2016-09-21
  • 打赏
  • 举报
回复
引用 2 楼 hili210 的回复:
[quote=引用 1 楼 pcradio 的回复:]
This method reads or writes the text in the CEditView object to a text file. SerializeRaw differs from the CEditView internal implementation of Serialize in that it reads and writes only the text, without preceding object-description data.

void SerializeRaw( 
CArchive& ar ); 
文本文件不关心后缀,其他格式的文本文件是可以打开的,我可以理解为你想默认的文件打开对话框过滤器中出现*.txt?
其实我是发现默认新建出来的打开文本文件都是乱码,格式不正确,需要读取txt这种文本文件还需要处理[/quote] 我不太确定SerializeRaw是不是只写入了文本而没有写入版本号什么之类的非字符数据,确实不用继承,你可以直接获取view文本,然后在Doc的Serialize里做序列化
hili210 2016-09-21
  • 打赏
  • 举报
回复
已经解决了,我继承了CEditView重新编写了SerializeRaw,其实不用继承也行 我看了一种方法,感觉还行,保存我直接在Doc类中采用原来的方法了

void CVCEditView::SerializeRaw(CArchive& ar)
{
	if (ar.IsStoring())
	{
		///SaveFile(*ar.GetFile());
	}
	else
	{
		OpenFile(*ar.GetFile());
	}
}

//****************************************************************************************
BOOL CVCEditView::OpenFile(const CString& strFileName)
{
	CFile file;
	if (!file.Open(strFileName, CFile::modeRead))
	{
		TRACE(_T("File not found: %s"), strFileName);
		return FALSE;
	}

	return OpenFile(file);
}
//***************************************************************************************
BOOL CVCEditView::OpenFile(CFile& file)
{
	try
	{
		// Prepare buffer:
		const DWORD dwFileSize = (const DWORD)file.GetLength();
		char* pszFileBuffer = new char[dwFileSize + 2];
		memset(pszFileBuffer, 0, dwFileSize + 2);

		// Read from a file:
#if _MSC_VER >= 1300
		file.Read((void*)pszFileBuffer, dwFileSize);
#else
		file.ReadHuge((void*)pszFileBuffer, dwFileSize);
#endif

#ifdef _UNICODE

		if (dwFileSize == 0)
		{
			SetWindowText(_T(""));
			delete[] pszFileBuffer;
			return TRUE;
		}

		if (!IsTextUnicode((void*)pszFileBuffer, dwFileSize, NULL))
		{
			// Convert buffer to Unicode:
			WCHAR* pszTextBuffer = new WCHAR[dwFileSize + 1];
			memset(pszTextBuffer, 0, (dwFileSize + 1) * sizeof(WCHAR));

			const int nTextLen = MultiByteToWideChar(::GetACP(), 0,
				pszFileBuffer, dwFileSize, pszTextBuffer, dwFileSize);
			ASSERT((DWORD)nTextLen <= dwFileSize);
			if (nTextLen <= 0)
			{
				TRACE0("SaveFile failed - system convertion API failed\n");
				delete[] pszTextBuffer;
				return FALSE;
			}

			pszTextBuffer[nTextLen] = _T('\0');
			SetWindowText(pszTextBuffer);

			delete[] pszTextBuffer;
		}
		else
		{
			TCHAR* pszText = (TCHAR*)pszFileBuffer;

			// Skip byte-order mark:
			int nFlags = IS_TEXT_UNICODE_SIGNATURE;
			IsTextUnicode((void*)pszFileBuffer, dwFileSize, &nFlags);
			if (nFlags != 0) // has the Unicode byte-order mark (BOM)
			{
				pszText = pszText + 1;
			}

			SetWindowText(pszText);
		}

#else
		SetWindowText((TCHAR*)pszFileBuffer);
#endif

		// Free memory:
		delete[] pszFileBuffer;
	}
	catch (CFileException* pEx)
	{
		pEx->ReportError();
		pEx->Delete();

		return FALSE;
	}

	return TRUE;
}
//***************************************************************************************

hili210 2016-09-21
  • 打赏
  • 举报
回复
引用 1 楼 pcradio 的回复:
This method reads or writes the text in the CEditView object to a text file. SerializeRaw differs from the CEditView internal implementation of Serialize in that it reads and writes only the text, without preceding object-description data.

void SerializeRaw( 
CArchive& ar ); 
文本文件不关心后缀,其他格式的文本文件是可以打开的,我可以理解为你想默认的文件打开对话框过滤器中出现*.txt?
其实我是发现默认新建出来的打开文本文件都是乱码,格式不正确,需要读取txt这种文本文件还需要处理
阿源是少年 2016-09-21
  • 打赏
  • 举报
回复
This method reads or writes the text in the CEditView object to a text file. SerializeRaw differs from the CEditView internal implementation of Serialize in that it reads and writes only the text, without preceding object-description data.

void SerializeRaw( 
CArchive& ar ); 
文本文件不关心后缀,其他格式的文本文件是可以打开的,我可以理解为你想默认的文件打开对话框过滤器中出现*.txt?

16,473

社区成员

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

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

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