0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言-fseek不起作用写操作定位无效简析

嵌入式那些事 来源:嵌入式那些事 2023-05-04 09:35 次阅读

情况说明

最近在写一个操作文件的函数,使用fseek()函数定位到文件某个位置,然后用fwrite()重新更新该位置的内容,发现该位置处的内容并没有更新,反而更新的内容竟然出现在了文件末尾,真的是不知道什么情况。

问题复现

下面先简单复现我所遇到的问题吧,示例代码如下:

/*
*By:AilsonJack
*Date:2019.01.24
*Blog:www.only2fire.com
*Des:fseek测试
*/

#include

intmain(void)
{
char*fileName="test.txt";
charch='W';
FILE*fp=NULL;
intiRet=0;

fp=fopen(fileName,"a+");
if(!fp)
{
printf("open%sfailed!
",fileName);
return-1;
}

iRet=fseek(fp,0,SEEK_SET);/*定位指针到文件头*/
if(iRet< 0)
 {
  printf("fseek failed!
");
  fclose(fp);
  return -1;
 }

 fwrite(&ch, 1, 1, fp); /*向文件中写入单个字符 'W'*/

 fclose(fp);

 return 0;
}

将上述代码编译,然后在编译输出文件所在的文件夹中创建一个test.txt文件,内容为:

123456789abcdef

cda0ac38-e87f-11ed-ab56-dac502259ad0.png

2019-01-24_185403

cdb32fd4-e87f-11ed-ab56-dac502259ad0.png

2019-01-24_185449

接着运行程序,打开test.txt,可以看到内容(字符W)被写到文件的末尾了:

cdbcb392-e87f-11ed-ab56-dac502259ad0.png

2019-01-24_185803

cdd3f9d0-e87f-11ed-ab56-dac502259ad0.png

2019-01-24_185815

原因分析

这是什么情况,明明使用fseek定位到文件的开头了,但是实际却写入到了文件末尾,好吧,当时我也是挺困惑的,难道是写fseek()接口函数的哥们还遗留有什么bug。后来上网查证,发现这是我们打开文件的所使用的模式"a+"在作怪。下面看看对该模式的描述,直接在终端输入:man fopen:

cde31032-e87f-11ed-ab56-dac502259ad0.png

2019-01-24_190507

其中对fopen()函数涉及的a与a+模式的描述如下:

a:Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file.

a+:Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.

上述对a与a+模式的描述大致内容是:打开一个文件,如果该文件不存在将创建文件,初始化的文件读指针位于文件的开头;对于文件的写操作,则始终将写入内容追加到文件的末尾,与文件指针没有关系。

想必看到这里,大家也明白了。如果想使用fseek()函数定位写操作指针,那么就修改fopen()涉及的模式,这里修改为"r+",就能实现将内容写到文件的开始了,对于自己的程序大家还是根据实际情况修改为相应的模式。

ce01b1e0-e87f-11ed-ab56-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7552

    浏览量

    132013

原文标题:C语言-fseek不起作用,写操作定位无效

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    IAP中断向量不起作用

    致力于STM32F051。 引导加载程序工作正常,但即使将向量表定位到SRAM后,应用程序文件中的中断向量也不起作用。 任何解决方案将不胜感激。以上来自于谷歌翻译以下为原文 Working
    发表于 11-27 15:56

    ShortCut of Comment/Uncomment Selection不起作用

    在PSoC造饰器3.3中按下Ctrl +E、C/CTRL+E、U是不起作用的。谁能告诉我发生了什么事?谢谢您! 以上来自于百度翻译 以下为原文It does not work to press
    发表于 02-25 08:53

    示例固件不起作用

    示例固件不起作用?以上来自于谷歌翻译以下为原文 Sample firmware not working?
    发表于 04-08 16:38

    程序不起作用

    已经改为更高版本。我遇到的问题是用户必须在使用程序之前通过VEE中的.NET程序集参考菜单重新加载较新的DLL。没有它,该程序不起作用(因为它在C:\ Program Files \ Agilent
    发表于 04-22 13:56

    按键扫描程序不起作用

    ,结果也是WK_UP无效,也是不管按下不按下,都不起作用,我用万用表测试了这个按键,这个按键完好,就不知道问题出在哪里?是不是板子电路的问题,求救!!!
    发表于 05-20 04:35

    FX3 DVK板读取操作不起作用

    嗨,我用的是FX3 DVK板。我想使用GPIF II作为主模式。操作良好。读取操作不起作用。在DMA事件上不调用回调函数。你能解决这个问题吗?请检查附件。问候JW邮编1.8兆字节
    发表于 05-20 15:07

    使用LabVIEW VISA例程读写操作不起作用

    的读写操作不起作用。有什么不同? 以上来自于谷歌翻译 以下为原文I'm trying to use an E5810 with an Anritsu ME522A bit error
    发表于 08-01 08:37

    能量收集不起作用

    你好, 我从核L476RG,MEMS和NFC02A1开始。我尝试将MEMS数据写入nfc标签及其工作。我的问题是当我尝试使用能量收集模式时,它不起作用,我不知道为什么。我在nfc多维数据集中使用这个
    发表于 08-01 10:58

    如何解决串口接收中断不起作用的问题?

    如何解决串口接收中断不起作用的问题?
    发表于 12-09 07:38

    mcp3421 18不起作用是怎么回事?

    =i2c.read() cifra3=i2c.read() i2c.end() 打印 cifra1 打印 cifra2 打印cifra3 结束 i2c.write(28
    发表于 04-26 08:02

    Freemaster记录器不起作用怎么解决?

    我创建了一个记录器,但它不起作用。出现错误 0x80000081(无效命令)。我还添加了 FMSTR_Recorder(0)。
    发表于 05-18 07:40

    模型不起作用时的解决办法

    你的团队几个月来一直在收集数据、构建预测模型、创建用户界面,并与一些早期的用户一起部署新的机器学习产品。但你现在听到的并不是大家一起庆祝项目胜利的声音,而是听到产品经理对那些早期用户的抱怨,这些早期用户对模型精度不满意并开始认为“模型不起作用”。所以你现在应该做什么?
    的头像 发表于 05-04 09:54 2722次阅读

    时控开关为什么不起作用,其中的原因是什么

    时控开关不起作用:简单解释就是时控开关设置好了定时时间,但是到时间不工作,是怎么回事? 目前时控开关分为两种:按键式时控开关和蓝牙时控开关,咱们分开来讲解: 按键式时控开关不工作原因:1.校时(时间
    发表于 01-07 15:06 1.9w次阅读

    解决西门子触摸屏变量的数值更改事件有时不起作用

    为什么西门子触摸屏变量的数值更改事件,有时不起作用。是因为采集模式没有选择,在菜单栏里右键属性,勾上采集模式,然后选择循环连续。
    的头像 发表于 11-08 17:22 5143次阅读

    KT142C语音芯片配置文件总是不起作用?配置文件的问题集中归纳

    KT142C语音芯片配置文件总是不起作用?配置文件的问题集中归纳
    的头像 发表于 10-20 15:04 366次阅读
    KT142<b class='flag-5'>C</b>语音芯片配置文件总是<b class='flag-5'>不起作用</b>?配置文件的问题集中归纳