bsp; CFile file(襎ESTFILE.TXT*, CFile::modeRead);
// Read data from the file.
char s[81];
int bytesRead = file.Read(s, 80);
s[bytesRead] = 0;
CString message = s;
当带着CFile::modeRead状态标记打开文件时,这种方式打开的文件仅用于读操作。其后,程序创建一个字符缓冲区并调用文件对象的Read( )成员函数来向缓冲区读入数据。Read( )函数的两个参量为缓冲区的地址和读入字节的个数。此函数返回实际读入的字节个数,在该例中它几乎总是小于80。使用所读取的字节个数,程序可在字符数据的末尾加0来创建一个标准的C类型字符串,该字符串可用于设置CString变量。
上面的代码片段用了个比较难的文件名。要想让你的用户提供文件名,在联机帮助中查看MFC类CFileDialog,你可以很容易增加这个功能。要给程序添加一些特色是非常简单的。
创建自己的CArchive对象
尽管可以使用CFile对象处理文件,但可以更进一步并且创建自己的CArchive对象,就像在Serialize( )函数中使用的CArchive对象一样,读者完全可以使用自己创建的CArchive对象。这使得读者可以利用为其他对象编写的Serialize( )函数,向它们传递对自己的档案对象的引用。
为创建一个档案文件,需创建一个CFile对象并将其传递给CArchive的构造函数。例如,如果想将对象通过档案文件写入到一文件中去,可创建如下的档案文件:
CFile file("FILENAME.EXT", CFile::modeWrite);
CArchive ar(&file, CArchive::store);
在创建档案文件对象后,可以如MFC所提供的档案文件对象一样使用该档案文件。由于采用CArchive::store标记进行档案文件对象的创建,对IsStoring( )的调用返回TRUE,而且把对象转储到档案文件的代码开始执行。当完成档案文件对象后,可按如下方式关闭档案文件:
ar.Close( );
file.Close( );
在读者已经完成它们后,如果对象超出应用范围,可以安全地忽略对Close( )的调用,这是因为CArchive和CFile已经在析构函数中调用了Close( )。
理解注册
在Windows编程的早期,应用程序在初始化文件(.ini文件)中保存设置和选项。使用巨大的WIN.INI文件或无数的私有INI文件的日子已经过去了—当一个应用程序希望存储私有信息时,它使用集中的系统“注册”。而且,尽管“注册”很容易使得进程间共享信息,但对于程序员而言,则使情况更加令人迷惑。下面,将揭开“注册”的神秘面纱和
学习如何在你的应用程序中控制它。
注册是如何设置的
不同于可以用任何文本编辑器进行编辑的纯文本文件的INI文件,“注册(Registry)”包含的二进制和AscII信息只能用Registry Editor进行编辑,或者是用为管理Registry专门创建的特殊API函数调用来进行编辑。如果读者曾经使用过Registry Editor浏览系统的注册,就会知道它包含了大量的组织成树形结构的信息。首次运行Registry Editor时的注册,可以在Windows文件夹中找到称为REGEDIT.EXE的Registry Editor,或者可以在Start菜单的Run命令中键入regedit然后单击OK。
在左边的窗口中列出了Registry的预定义键。在键旁的加号表示可以打开此键来查看更多与之相关的信息。键可以有子键,子键可以有自己的子键。一个键或子键可以有也可以没有与之相关联的一个值。如果在层次中探寻得比较深入的活,可以看见在右边窗口中的一列数值。要想亲眼看到这些值,可以从HKEY_CURRENT_USER到Control Panel到Appearance到Schemes进行浏览,可以看到在系统上所安装的桌面系统。
预定义的键
为了知道在Registry中所存储的的东西在哪里,就需要知道预定义键和它们所代表的意思。
* HKEY_CLASSES_ROOT
* HKEY_CURRENT_USER
* H