C标准流文件变小时的写操作异常问题

在当前项目开发中设计使用单个的文本配置文件来保存参数,并编写了一套相应的增删改查接口,在进行功能测试时,看似一切都OK。但是当对配置文件进行查看检验时,发现在进行删除和修改操作后,文件的结尾总是会多出一段无效内容,而且总是最后一些文本行的重复。

文件操作接口的主要设计思路如下:

  • 增:搜索到指定的参数类位置,插入指定的参数内容;没有则插入文件末尾。
  • 删:搜索到指定的参数类别和参数名称,备份该参数内容后的文件内容到内存,然后覆盖到参数内容。
  • 改:搜到到指定的参数类别和参数名称,备份该参数内容后的文件内容到内存,用新的参数内容覆盖原参数内容后,再将备份文件内容写回文件。
  • 查:搜到到指定的参数类别和参数名称,返回参数内容数组。
增加和查找操作测试没有问题,参数文件读写正常。但是删除和修改操作可以实现功能,但是参数文件写异常,文件末尾会有无效文本。一开始我以为是程序中的文件位置偏移、定位和备份、恢复出了问题,但是使用gdb跟踪调试了一个上午后,发现偏移定位、读写都没有问题,纠结了半天。在gdb调试过程中,观察到删、改操作异常时,都是文件的长度和操作之前的长度一致,预期应该是长度变短才对,加上一开始观察到的无效文本总是文件结尾部分内容的重复:怀疑是文件的长度不能通过读写来进行缩减,可以通过写来加长(增加操作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函数得出的才是新文件的正确长度,也避免了自己去计算长度(我一开始就是使用旧长度减去删除的大小来计算的......)。

转载于:https://my.oschina.net/shelllife/blog/144333

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值