天天看点

去除源文件中的重复行的程序流程及其C代码实现

一、需求描述

要求对一个包含若干行记录且某几条记录相同的文件(源文件)实现去重操作,并将去重之后的记录写入到另外一个文件(目的文件)中。也即最后生成的文件中没有内容相同的两行记录。如果源文件中两条记录之间有空行,则在目的文件中一并将其去掉。

两条记录相同的标准是:

1) 字符个数及内容完全相同。

2) 去除空格及回车换行符之后的内容完全相同。

示例:

源文件样例:

对应的目的文件样例:

二、程序总体流程

为了实现去重操作,我们考虑使用链表数据结构。先将源文件中的记录内容逐条读取,与链表中已经存在的记录内容相比较,如果没有与之相同的,则将该条记录加入链表。当源文件中的所有记录内容都读取完成之后,再将链表中的记录内容写入到目的文件中。

程序的总体流程如图1所示。

去除源文件中的重复行的程序流程及其C代码实现

图1 程序的总体流程

三、重要程序流程及数据结构介绍

1.存放记录内容的链表

本程序使用链表来存放从源文件中读取到的每条记录,该链表的结构如下:

2.判断某条记录是否已存在于链表的函数

每当读取到一条记录,就要判断该条记录是否已经存在于链表中了(第一条记录除外)。判断操作非常的简单,只需要遍历整个链表就可以了。该操作由IsInList函数实现,其具体代码如下:

3.去除记录的回车换行符、去除记录中的空格的函数

RmNewLine函数用于去除记录的回车换行符,RemoveSpaceInStr函数用于去除记录中的空格。这两个函数的程序代码请见附录。

四、程序编译及执行结果

将RemoveRepeatLine.c(详细的代码请见附录)程序上传到Linux机器上,使用gcc -g -o RemoveRepeatLine RemoveRepeatLine.c命令对其编译,生成RemoveRepeatLine。

在本程序中,我们使用的源文件为TestFile.txt,位于当前用户的zhouzhaoxiong/zzx/RemoveRepeatLine/TestFile目录下;生成的目的文件为ResultFile.txt,与源文件位于相同的目录之下。

本人使用的源文件TestFile.txt的内容为:

运行RemoveRepeatLine命令之后,生成结果文件ResultFile.txt,其内容为:

可见,程序满足了需求,去除了重复的行,同时将多余的空行也去掉了。

五、总结

关于本程序,有如下几点说明:

第一,链表这种数据结构在实际的软件开发项目中应用得非常的广泛,大家一定要熟练掌握其用法,特别是如何向链表中插入数据、如何遍历整个链表、如何清空链表等。

第二,写文件函数WriteToFile中,在“strncpy(szContentBuf, ptContentListHead->szContentLine, strlen(ptContentListHead->szContentLine));”语句之前,一定要加上“memset(szContentBuf, 0x00, sizeof(szContentBuf));”语句,否则写入文件中的内容可能不是我们想要的。大家也可以在自己的机器上试试,看加与不加“memset(szContentBuf, 0x00, sizeof(szContentBuf));”语句,生成的结果文件有何区别。

第三,在有关话单生成及处理的程序中,对源话单文件进行去重操作是大家必须考虑的问题。本文中的程序为相关项目的开发人员提供了参考。

附:完整的程序代码

继续阅读