在当前项目开发中设计使用单个的文本配置文件来保存参数,并编写了一套相应的增删改查接口,在进行功能测试时,看似一切都OK。但是当对配置文件进行查看检验时,发现在进行删除和修改操作后,文件的结尾总是会多出一段无效内容,而且总是最后一些文本行的重复。
文件操作接口的主要设计思路如下:
- 增:搜索到指定的参数类位置,插入指定的参数内容;没有则插入文件末尾。
- 删:搜索到指定的参数类别和参数名称,备份该参数内容后的文件内容到内存,然后覆盖到参数内容。
- 改:搜到到指定的参数类别和参数名称,备份该参数内容后的文件内容到内存,用新的参数内容覆盖原参数内容后,再将备份文件内容写回文件。
- 查:搜到到指定的参数类别和参数名称,返回参数内容数组。
那就只能显式地改变文件的大小,截断它,使用Linux系统下的ftruncate接口实现。
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
首先需要将FILE指针转换为fd,然后是获取新文件的长度,通过ftell函数来得到,实现代码行:
fflush(stream);
ftruncate(fileno(stream), ftell(stream));
fflush函数的作用是很重要的,保证文件内容都已被写入文件。必须要确保这两行代码是在所有的写入的操作都已经完成,只有这样ftell函数得出的才是新文件的正确长度,也避免了自己去计算长度(我一开始就是使用旧长度减去删除的大小来计算的......)。