CFile file("/*file name*/", CFile::modeReadWrite);
CArchive ar(&file, CArchive::load);
然后保证你的类是由CObject派生,修改里面的Serialize函数,在类中加入 DECLARE_SERIAL(/*CLASS NAME*/)
在它的实现部分加入
IMPLEMENT_SERIAL(/*CLASS NAME*/, CObject, schema number/*这个默认设置为1就可以了*/);
比如我们要记录一个输出标语的程序,那么它的代码(输入部分)如下:
class MyString: public CObject //这是必须的!对序列化操作必须由CObject类派生
{
DECLARE_SERIAL(MyString);
CString str;
public:
MyString(){} //必须有一个默认构造函数!!
void Serialize (CArchive &ar);
};
实现部分:
。。。
IMPLEMENT_SERIAL(MyString, CObject, 1) //这里的最后一个参数叫做schema number实际就是你程序的版本号,这是为了防止读入数据与原数据版本不符(比如说,你增加了一个变量)
void Serialize(CArchive &ar)
{
CObject::Serialize (ar);
if (!ar.IsStoring())//如果不是存储:
ar>>str;
else
ar<<str;
}
try{
CFile file("e://read.txt", CFile::modeRead);//定义一个file类型的类,注意,这里的文件路径一定要像写网址那样!这是C语言的特点。
CArchive ar(&file, CArchive::load);
ar>>str;
}
catch(CFileException *e)
{
e->ReportError();
e->Delete();
}
其实你大可放心,几乎所有的View(视图)、Wnd(窗口)类都是从CObject类派生的,你只要在里面定义一些变量以及序列化操作就可以了!
如果上面的例子太抽象,那么下面的实例对你应该有所帮助:
在这个例子中,我们在屏幕上打出helloworld!并将其输入到文件中。注意这里头文件在后面!
/////////////////这里是源文件///////////////////////////
/////////////////hello.cpp////////////////////////////
#include<afxwin.h>
#include "hello.h"
CMyApp theApp;
BOOL CMyApp::InitInstance()
{
m_pMainWnd= new CMainWindow(3);
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
IMPLEMENT_SERIAL(CMainWindow, CFrameWnd, 1)//实现序列化
CMainWindow::CMainWindow(int x)
{
Create(NULL, _T("An MFC Application"));
str = "Hello World!";
}
void CMainWindow::OnPaint()
{
CRect rect;
GetClientRect(&rect);
CPaintDC dc(this);
dc.DrawText(str, -1, &rect,
DT_VCENTER | DT_SINGLELINE | DT_CENTER);
try{
//打开文件,准备写入,如果没有,则创建
CFile file("e://test.txt", CFile::modeWrite | CFile::modeCreate);
//定义CArchive类的对象ar
CArchive ar(&file, CArchive::store);
ar<<str;//实现输出
}catch(CFileException *e){
e->ReportError();
e->Delete();
}
}
//改写Serialize函数
void CMainWindow::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
ar<<str;
else
ar>>str;
}
//////////////////////////这里是头文件////////////////////
/////////////////////////////////////////////////////////
///////////////////////////hello.h////////////////////////
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWindow:public CFrameWnd
{
DECLARE_SERIAL(CMainWindow) //声明序列化
protected:
CString str; //定义变量
public:
CMainWindow(int x);
CMainWindow(){};//空构造函数(必须)
void Serialize (CArchive &ar); //定义Serialize函数
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
温馨提示:内容为网友见解,仅供参考
C++字符串比较问题!
首先该明白的是对两个串用==来比较, 比的不是串的内容, 而是串的地址.在这个程序里, 两个"JOIN"都是以常量的形式出现的, 有一些编译器, 对这两个常量分别分配了不同的内存, 保存相同的字串内容. 两个串的内容相同, 但是地址不同, 这样的编译器编译的程序会返回假.而另一些编译器为了优化存...
VC++中应当注意对VC字符集的设置
5.但是这个函数功能还是不正常,断点进入那个函数里面发现传进去的字符串只有一个字符了,这种情况就是宽字符当成短字符时,第二个字节的当成了字符串的截止字符了,也就是说,这个函数里采用的是短字符(多字符集Multi Byte)处理的。6.我的工程采用的是宽字符集(Unicode Char)的,检查设置,原来那个老外是用VC6编的,...
VC++ CString::Replace()替换字符 问题
VC++ CString::Replace()替换字符 问题 下面是我自己写的一个整型数字替换代码是可行的,但是不知道如何将字符分开导入数组中查找替换,还是说有什么方法不用导入数中就可以查找替换的。#include"stdafx.h"voidab(inta,intb... 下面是我自己写的一个整型数字替换代码是可行的,但是不知道如何将字符分开导入数组中查...
关于C++中的字符串输出。。。
有乱码是因为char p指向的内存空间有10个字节,这十个字节中没有字符串结束符'\\0',所以在输出时,因为没有找到'\\0',所以导致了读取了非法的内存空间,因为非法内容空间的内容是不确定的,所以程序是有问题的,改成下面这样就好了。。include <stdio.h> include <IOSTREAM> using namespace std;int...
vc++的一个很简单问题。请高手帮帮手。小弟无尽感激
fun函数 首先把字符串s复制给w 然后进行循环 把w的地址给p t1的地址给r 如果r中的内容等于p中的内容 则地址加一 否则跳出这次循环 这样一直进行下去 由于r中是t1的地址 就是存有ab那个 当他进行到最后一次时 r会等于0 这时把那个“a”字符的地址(即为w的地址)赋予a 最后用...
关于VC++字符串的问题
MyString(){} \/\/必须有一个默认构造函数!!void Serialize (CArchive &ar);};实现部分:。。。IMPLEMENT_SERIAL(MyString, CObject, 1) \/\/这里的最后一个参数叫做schema number实际就是你程序的版本号,这是为了防止读入数据与原数据版本不符(比如说,你增加了一个变量)void Serialize...
关于vc++的CString类获取字符长度问题???
length = m_Data.GetLength();就是字符串长度。如果m_Data是编辑框关联字符串变量,那么在调用之前最好加上语句:UpdateDate(TRUE);\/\/更新控件变量值 另外,length是一个UCHAR,最大只有255,并不是很安全,建议定义为int
vc++ 中如何判断字符串?
if(a=='a')\/\/单个字符比较 如果a为CString,就可以直接比较,如:if(a==“abcd”)
我用VC++2008写的用FORMAT 格式化字符串怎么不对呢?
CString strOutput;strOutput.Format("%s","Hello World!");pDC -> TextOut(0,0,strOutput);修改为 CString strOutput;strOutput.Format("%s",L"Hello World!");pDC -> TextOut(0,0,strOutput);因为VS里用的是Unicode编码,所以字符串要改为宽字符。在字符串前加个L ...
VC++ 字符串拼接 ,error C2666
CString temp = m+ CString(_T("次"));你拼错了,改成 CString temp = temp+ CString(_T("次"));报错的原因是,你用整形变量m和字符串进行 加运算。编译器找不到匹配的重载运算符 + 。