文件读写操作
上一讲我们学习了事件和事件处理函数的有关知识,并为 Mp3Collect 程序添加的进行记录操
作的代码,但是程序还缺少保存记录的功能,以至于当程序退出之后,我们辛苦输入的记录就丢
失了,因此在本讲中,我们就首先来学习有关文件读写操作的知识,然后继续添加事件处理函数,
实现查询记录的功能。
在应用程序中保存信息和数据的常用方法有三种:第一种是保存在 Windows 的注册表中,第
二种是保存在程序专用的文件中,第三种则是保存在数据库中。第一种方法只适合于保存少量关
键的信息,例如程序的参数和选项,对于我们的例子程序来说,歌曲记录的数量可以是非常多的,
因此不适合保存在注册表中。第二种方法是最常用的,也比较容易实现,因此现在我们先采用第
二种方法来保存记录。第三种方法对于保存大量结构化的数据是最有效的,例如 Mp3Collect 的歌
曲记录,但实现起来相对要复杂得多,在讲座的后面我们再来学习数据库操作方法。
用于文件操作的函数也有很多种,我们选择使用 I/O 流函数和 FILE *指针来进行对文件的操
作,因为这些函数符合 ANSI C/C++规范,可移植性较好,能够用于 Win32、Unix 平台,是比较常
用的文件操作方式。I/O 流函数和 FILE 结构的声明和定义位于头文件 stdio.h 中。
保存记录文件
下面介绍如何保存文件记录。
首先,为主窗体类添加一个 SaveFile()
成员函数。在类浏览器中找到 TMainForm
类,用右键单击该类,在关联菜单中选择
New Method 命令,就会弹出如图 10-1 所示
的 Add Method 对 话 框 。 在 其 中 的 Method
Name 中输入新的成员函数名 SaveFile,函
数的参数(Arguments)为空,返回类型为
void,即没有返回值。函数的访问权限为私
有 的 ( Private ) , 函 数 的 调 用 方 式 为
__fastcall,这是因为按照 CBuilder 的规定,
所有窗体类的成员函数的调用方式都必须为
__fastcall 方式。设置好这些函数属性后,
按下“OK”按钮,CBuilder 就会自动添加好
SaveFile()函数的框架。
接下来在 SaveFile() 函数中添加代码,
实现保存文件的功能。我们约定保存记录的
文件名为 Mp3Collect.sav,文件目录为当前工作目录,当前工作目录是通过调用 GetCurrentDir()函
数获得的。文件的格式为普通的文本文件,每个列表项的内容以字符串的方式写入文件中,其中
每个字符串为单独的一行,因此每个列表项在文件中占三行。在对文件进行 I/O 流操作之前,首
先需要打开文件,并获取文件的 FILE*指针。
我们通过 fopen()函数以文本以及创建新文件的方式打开 Mp3Collect.sav 文件,然后读取
ListView1 中的列表项,利用函数 fprintf()将每个列表项的内容写入文件中。下面 SaveFile()函数的
图 10-1 : Add Method 对话框