fputs函数修改文件出现位置偏移问题

    在Linux嵌入式端,想通过c库函数,修改一个文本文件,在使用fputs函数写文件时出现了真正写入的文件的位置不对。具体操作流程如下:

 

  • 通过fopen打开已存在的文本;
  • 通过fgets读取文本内容并查找相应字符串;
  • 当查找到需要修改的字符串时,直接在fgets返回的字符缓冲修改后,通过fputs函数将内容回写文件;
  • fclose函数关闭文本操作。
myFile = fopen("xxx", "rb+");

fseek(myFile, 0L, SEEK_SET);

memset(str, 0, 256);
while (fgets(str, 256 , myFile)){
    if (!strncmp(key, str, strlen(key))){
        /*replace str */
        /* ... */
        fputs(str, myFile);
    }
    memset(str, 0, 256);
}

fclose(myFile);

    如此操作的时候,会发现,真正写入文件的位置不是你通过fgets函数读取到的位置,这个时候,需要在通过fseek函数,将文件指针位置指向当前读取位置再fgets写入文件,这样才会正常写入。

myFile = fopen("xxx", "rb+");

fseek(myFile, 0L, SEEK_SET);

memset(str, 0, 256);
while (fgets(str, 256 , myFile)){
    if (!strncmp(key, str, strlen(key))){
        /*replace str */
        /* ... */
        
        fseek(myFile, 0, SEEK_CUR);
        fputs(str, myFile);
    }
    memset(str, 0, 256);
}

fclose(myFile);

    具体是什么原因导致的也没有去深究,猜测可能是因为一开始fopen文件之后,一直都是读取数据,将会有个文件流缓冲机制,虽然当前fgets函数获取的数据偏移是100,但可能文件指针已经到达数据偏移120的位置,所以需要通过fseek函数将文件指针重新指向当前文本位置再写入。

    以上为个人观点,有不同看法可以讨论,学习,谢谢。

    经过@嘉木有鱼大神的指点,了解到问题的原因了。很简单,是因为在使用fgets读取文本数据返回的时候,此时文件指针已经指向读取位置的末端了,所以这个时候通过fputs写入数据,自然的就会在读取数据的末端。感谢嘉木有鱼大神的指点。

 

转载请注明出处!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chengwei_peng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值