caxa发生文件读写异常_C标准流文件变小时的写操作异常问题

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

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

增:搜索到指定的参数类位置,插入指定的参数内容;没有则插入文件末尾。

删:搜索到指定的参数类别和参数名称,备份该参数内容后的文件内容到内存,然后覆盖到参数内容。

改:搜到到指定的参数类别和参数名称,备份该参数内容后的文件内容到内存,用新的参数内容覆盖原参数内容后,再将备份文件内容写回文件。

查:搜到到指定的参数类别和参数名称,返回参数内容数组。

增加和查找操作测试没有问题,参数文件读写正常。但是删除和修改操作可以实现功能,但是参数文件写异常,文件末尾会有无效文本。一开始我以为是程序中的文件位置偏移、定位和备份、恢复出了问题,但是使用gdb跟踪调试了一个上午后,发现偏移定位、读写都没有问题,纠结了半天。在gdb调试过程中,观察到删、改操作异常时,都是文件的长度和操作之前的长度一致,预期应该是长度变短才对,加上一开始观察到的无效文本总是文件结尾部分内容的重复:怀疑是文件的长度不能通过读写来进行缩减,可以通过写来加长(增加操作OK)。

那就只能显式地改变文件的大小,截断它,使用Linux系统下的ftruncate接口实现。

#include

#include

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函数得出的才是新文件的正确长度,也避免了自己去计算长度(我一开始就是使用旧长度减去删除的大小来计算的......)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值