linux fseek 定位指定内容位置,fseek不起作用,写操作定位无效_夜间飞行员的博客-程序员秘密

技术标签: linux fseek 定位指定内容位置  

By: Ailson Jack

Date: 2019-01-24

个人博客: http://www.only2fire.com/

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

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

/*

 *By:Ailson Jack

 *Date:2019.01.24

 *Blog:www.only2fire.com

 *Des:fseek 测试

*/

#include <stdio.h>

int main(void)

{

    char *fileName = "test.txt";

    char ch = 'W';

    FILE *fp = NULL;

    int iRet = 0;

    fp = fopen(fileName, "a+");

    if(!fp)

        printf("open %s failed!\r\n", fileName);

    iRet = fseek(fp, 0, SEEK_SET); /*定位指针到文件头*/

    if(iRet < 0)

    {

        printf("fseek failed!\r\n");

        goto exit;

    }

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

exit:

    fclose(fp);

    return 0;

}

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

1548329021381124.png

1548329021730395.png

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

1548329021633900.png

1548329021629642.png

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

1548329116157263.png

其中对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+”,就能实现将内容写到文件的开始了,对于自己的程序大家还是根据实际情况修改为相应的模式。

1548329021641132.png

如果有什么疑问,欢迎留言交流^_^。

热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!

注: 转载请注明出处,谢谢!^_^

7beb17ed588029e0a90899d3ce8053cd.png

a61d5057dd5fb78117c6e6929593b763.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33955740/article/details/116846184

智能推荐

mongodb:$elemMatch $aggregate实现只获取嵌套数组对应条件的记录_qq_38313984的博客-程序员秘密

想要实现输入框输入内容后,后端通过正则匹配查询出匹配的省市信息1.输入’深‘,想要获取含有‘深’字的深圳市的数据,mongo数据库中结构如下最开始 city.find({"city_list.city_name":{'$regex':"深"}}),这样筛选得到的结果是含有深圳市的广东省所有数据集要想只得到深圳一条记录,需要再得到的结果再做嵌套筛选city.find({"city_list.city_name":{'$regex':"深"}},{"city_list":{$elemMa

显示杂谈(3)-gamma2.2进入显示屏神器-OTP_qq_39361190的博客-程序员秘密

上次我们讲述了显示屏为什么选择Gamma2.2,不懂的话,可以看看我的另一篇文章,主要介绍为什么选择gamma2.2 https://zhuanlan.zhihu.com/p/183249424大家可能也都已经了解,那是因为咱们的眼睛选择的结果啊。那个这个gamma2.2是如何进入我们的显示屏中的呢?目前就职于OLED场,就以OLED也基础,说一说我们的gamma2.2是如何进入OLED显示器中的。我们的屏体做完之后,都会有一个步骤,这个步骤就是把gamma写进OLED显示屏中。那没有写入前是啥样的

tailf_weixin_34337381的博客-程序员秘密

功能说明:tailf命令几乎等同于tail -f,与tail -f不同的是,如果文件不增长,那么它不会去访问磁盘文件,也不会更改文件的访问时间。tailf命令在工作中的主要使命就是跟踪日志文件,首先将默认输出日志文件的最后10行,然后实时地显示文件的增加内容。参数选项:-n&lt;行数&gt; 指定显示的行数,默认是最后10行。转载于:https://www.cnblogs...

springboot配置内置tomcat的日志_TQFtqf小涂的博客-程序员秘密_springboot 内置tomcat localhost.log

在springboot的项目的配置文件中添加如下图所示代码 端口server.port=8050配置logserver.tomcat.accesslog.buffered=true server.tomcat.accesslog.directory=D:/logs/app server.tomcat.accesslog.enabled=true server.tom...

剑指offer(二) 不修改数组找出重复的数字_抚琴弹出情调零的博客-程序员秘密

二分查找模板:二分模板一共有两个,分别适用于不同情况。算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当 l = r 时,我们就找到了目标值。版本1当我们将区间 [l, r] 划分成 [l, mid] 和 [mid + 1, r] 时,其更新操作是 r = mid 或者 l= mid + 1;,计算mid时不需要加1。C++ 代码模板:int...

linux连同目录一起删除,【Linux】linux常用几个基本命令 小白专区简单易懂_weixin_39623671的博客-程序员秘密

显示日期的命令 date显示日历的命令 cal-s,--hctosys以硬件时钟为准,校正系统时钟hwclock,clock:显示硬件时钟-w, --systohc以系统时钟为准,校正硬件时钟关机命令shutdown关机:halt, poweroff, init 0重启:reboot, init 6-f: 强制,不调用shutdown-p: 切断电源shutdown [OPTION]... TI...

随便推点

YOLOv3--使用记录_royal_琦的博客-程序员秘密

这两天看了YOLO相关论文,跑了以下YOLOv3的代码,以下为相关过程的一些总结,持续更新,9.19。把数据集随机分为训练集和测试集,以小狗检测为例:separate.pyimport osimport shutilimport randomsrc_dir = 'dogTrainImg' #数据集源文件obj_dir = 'dogTestImg' #测试图片目录if ...

安装oracle报 Xlib: No protocol specified 错误_赶路人儿的博客-程序员秘密

使用 oracle用户,执行如下命令1 查看DISPLAY是否设置:env| grep DISPLAY   如未设置则,export DISPLAY=192.168.0.9:0.0 (斜体字修改为自己的服务器的ip) 2   root用户执行 xhost + 3  切换到oracle用户安装即可

C#读取csv文件内容到DataTable_简单的绿竹的博客-程序员秘密

http://blog.sina.com.cn/s/blog_7acc74e50100w4hp.html            int intColCount = 0;             bool blnFlag = true;             DataTable mydt = new DataTable("myTableName");

Android Opencv 获取轮廓坐标,轮廓结构关系_Aaron - Wistron的博客-程序员秘密

Canny要传黑白图片findContours要传黑白图片,Imgproc.RETR_CCOMP,Imgproc.CHAIN_APPROX_SIMPLE 根据需要自己设置。代码有点乱,挑关键代码用灰度图转黑白 private Mat processImage( Mat gray ) { Mat b = new Mat(); ...

android 百度地图 自定义地图标注,百度地图自定义标注_靳天羽的博客-程序员秘密

步骤:①定义构造函数并继承Overlay,通过构造函数参数可以传递一些自由的变量。设置自定义覆盖物对象的prototype属性为Overlay的实例,以便继承覆盖物基类。functionComplexCustomOverlay(point, item){this._point =point;this._text =item.name;this._child =item.idthis._numbe...

【ACM】PAT. B1015 德才论 【排序】_3stone_的博客-程序员秘密

题目链接 (与PAT A1062同题)题目分析解题思路按照题意对结构体排序,重写sort()函数中比较规则cmp即可,只是分类情况稍微有点麻烦而已。AC程序(C++)1/**************************//@Author: 3stone//@ACM: PAT-B1015. 德才论//@Time: 2018/1/25//@IDE: VS...

推荐文章

热门文章

相关标签