13.3 一个简单的文件压缩程序

这个程序把一个文件中的数据有选择地复制到另一个文件中。它同时打开两个文件,对其中一个使用“r”模式打开,对另一个使用“w”模式打开。程序清单13.2中的程序通过只保留每3个字符中的第3个来压缩第一个文件的内容。最后它将压缩后的文本写入第二个文件之中。第二个文件的名称是第一个文件名后加.red(代表reduced)而得到的。使用命令行参数、同时打开多个文件,以及对文件名进行追加操作,这些通常都是相当有用的技术。这种特殊的压缩形式的使用较为有限,不过还是有它的用途,这一点以后您会看到(再次说明,可以容易地修改程序,以使程序通过使用标准I/O技术而不是命令行参数来获取文件名)。

程序清单13.2 reducto.c程序

阅读 ‧ 电子书库

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

可执行文件名为reducto。我们用它对包含下面这行内容的文件eddy进行操作:

阅读 ‧ 电子书库

命令如下:

阅读 ‧ 电子书库

输出结果被写入文件名为eddy.red的文件中。程序不产生任何屏幕输出,但打开文件eddy.red,会显示下列内容:

阅读 ‧ 电子书库

这个例子演示了多项编程技术。现在我们来看看其中的一些。

除了需要一个文件指针作为第一个参数以外,fprintf()函数和printf()函数基本一样。我们使用stderr指针把错误消息发送到标准错误文件,这是一个标准的C惯例。

为了给输出文件构建一个新的文件名,程序使用strncpy()函数把名字eddy复制到数组name中。参数LEN-5为.red后缀名和最后一个空字符保留下空间。如果argv[2]字符串比LEN-5还长,就不会有空字符被复制了,因此程序只有在这种情况下添加一个空字符。调用strncpy()后name中的第一个空字符在strcat()函数附加上.red的时候,被其中的句号(.)给覆盖了,从而产生了eddy.red。我们还检查程序是否成功打开了文件名为eddy.red的文件。这在某些环境下尤为重要,因为像strange.c.red这样的文件名可能是非法的。例如,在DOS环境下不能再为文件后缀添加后缀(适用于MS-DOS的方法是用后缀.red替换任何已有的后缀,这样压缩版本的strange.c就变成strange.red。例如,可以使用strchr()函数来定位文件名中的句号(如果有的话),然后只复制字符串中句号前的部分)。

这个程序同时打开了两个文件,因此我们声明了两个FILE指针。注意每个文件的打开和关闭都独立于另一个。同时可以打开的文件数目是有限制的。这个限制取决于系统和实现;范围通常是10到20之间。可以使用同一个文件指针指向不同的文件,但前提是不能同时打开这些文件。