之前有个要把打开的文件清空,然后重新写入的需求,但是使用 ftruncate(fd, 0)后,并没有达到效果,反而文件头部有了'\0',长度比预想的大了。究其原因是没有使用 lseek 重置文件偏移量,是我太天真了,以为清空文件就会从头开始写入。

------------------------------------- 我是解释分割线 --------------------------------------

首先 man ftruncate 看下帮助手册

NAME

truncate, ftruncate - truncate a file to a specified length

SYNOPSIS

int truncate(const char *path, off_t length);

int ftruncate(int fd, off_t length);

DESCRIPTION

The truncate() and ftruncate() functions cause the regular file named by path or referenced by fd to be truncated to a size of precisely length bytes.

If the file previously was larger than this size, the extra data is lost.  If the file previously was shorter, it is extended, and the extended part reads as null bytes ('\0').

The file offset is not changed.

If  the  size  changed,  then the st_ctime and st_mtime fields (respectively, time of last status change and time of last modification; see stat(2)) for the file are updated, and the set-user-ID and

set-group-ID permission bits may be cleared.

With ftruncate(), the file must be open for writing; with truncate(), the file must be writable.

之前就是因为没有看到红色那行字,导致我产生了文件开头的错误,都说了文件偏移量是不会改变的!

实验如下:

#include

#include

#include

#include

#include

#include

int main(void)

{

int fd;

const char *s1 = "0123456789";

const char *s2 = "abcde";

fd = open("test.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);

/* if error */

write(fd, s1, strlen(s1));

ftruncate(fd, 0);

// lseek(fd, 0, SEEK_SET);

write(fd, s2, strlen(s2));

close(fd);

return 0;

}

运行效果:

去掉 lseek(fd, 0, SEEK_SET); 的注释后,效果如下:

结论:

从以上两张图中,可以看出,不用 lseek 的文件大小为15,用 xxd 查看16进制格式看到 文件头有10个 '\0' 填充。

而重置文件偏移量后,文件大小为5,内容也正确。

因此,在用 ftruncate 函数时,再次写入一定要重新设置文件偏移量(在 ftruncate 之前或之后都行,用 lseek 或 rewind 都可以)。

linux c 删除文件,Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)...相关推荐

  1. 在linux批量删除多级目录下同一格式的文件

    在linux批量删除多级目录下同一格式的文件,可采用find + exec命令组合: 如在删除指定目录下的,所有子目录中,后缀为.doc的文件方法为: find file_path -type f - ...

  2. linux定时删除文件,如何操作Linux 定时删除指定目下N天前的文件

    转载:http://www.51testing.com/html/74/n-3725074.html​ ​做测试的童鞋相信对Linux这个系统不陌生吧,若不及时清理某些文件,长时间运行下去,系统也会吃 ...

  3. linux 命令删除命令,Linux 命令之删除命令

    在Linux下删除文件用rm命令,具体用法如下: rm [选项] 文件 选项说明: -f -force 忽略不存在的文件,强制删除,无任何提示 -i --interactive 进行交互式地删除 -r ...

  4. linux如何删除日志,linux 删除日志

    https://jingyan.baidu.com/album/c1a3101e73129ade656deb9d.html?picindex=2 里面的 ls -s 可以看到目录 https://zh ...

  5. linux 安装删除命令,Linux如何使用命令行卸载安装包

    导读 严格地说,Linux是内核.Linux发行版由Linux内核.安装脚本.shell.编译器.桌面和其他组件组成.因此,卸载包或软件的Linux命令取决于Linux发行版的名称和类型.本文说明如何 ...

  6. php遍历视频文件,php使用glob函数遍历文件和目录详解

    php glob()函数返回匹配指定模式的文件名或目录.因此我们可以使用glob函数来查找文件,也可以实现目录的遍历. 函数说明:array glob ( string $pattern [, int ...

  7. php文件读取文件内容,PHP文件系统函数-读取文件内容几种方式

    介绍几种php获取文件内容的方式 介绍读取文件的方式之前,我们先看一下打开文件资源和关闭资源 名字资源绑定到一个流 - fopen 关闭一个已打开的文件指针 - fclose $handle1 = f ...

  8. C++文件eof()函数判断文件是否为空。

    eof()函数是文件流对象中的一个成员. 作用效果可以参考C中的feof 该函数使用场景:文件结束判断时是否是正常结束. eof()的返回值 1.eof()函数在文件未结束时返回值为0(假) 2.文件 ...

  9. c语言gets函数头文件string.h,string函数头文件

    string.h头文件中有什么函数 string.h头文件中的函数: #include //STL 通用算法 #include //STL 位集容器 #include //复数类 #include / ...

最新文章

  1. rabbitmq 查询版本_Hyperf 发布 v2.0.14 版本 | 企业级的 PHP 微服务云原生协程框架
  2. php新增数组函数,php操作数组函数
  3. logstic 回归
  4. Zabbix+shell监控报警任意web
  5. matlab人脸和非人脸分割,人脸检测与分割
  6. (转载)grep的使用
  7. es5直接引入html文件,ES6+转ES5(webpack+babel、指定多个js文件、自动注入)
  8. solaris下用户不能正常登录CDE界面的解决办法
  9. C#网络编程之---TCP协议的同步通信(相互发送接收数据)
  10. python用openpyxl模块操作Excel学习笔记
  11. linux指定网卡走流量,Linux实时输出指定网卡流量
  12. Navicat 常见操作
  13. 递归求地铁两站间最短路径
  14. 自定义view实现涂鸦(画板)功能
  15. 倍福PLC的ModbusRTU设置
  16. QQ群头像 微信群头像 多图合并框架实现
  17. 命令提示符怎么进入D盘?简单的技能分享
  18. Arrays.sort() 实现降序排列 Comparator接口实现的坑
  19. DevOps的发展史
  20. 总结一波腾讯,阿里,字节跳动问的 Redis 面试题,收藏起来。

热门文章

  1. vs2015编译android,VS2015 Update2 构建 Android 程序问题汇总
  2. python写表格_使用Python对Excel进行读写操作
  3. 卷积神经网络matlab_基于卷积神经网络的遥感图像养殖区自动划分
  4. linux下.rar的文件,Linux下.rar压缩文件处理 (RAR 4.11 for linux )
  5. mysql int(3)与int(11)的区别
  6. mysql dbcollat_Mysql Server 层混杂信息字典表 | 全方位认识 information_schem(四)
  7. linux中通常使用 键来终止命令运行,【单选题】Linux中通常使用( )键来终止命令运行A. Ctrl+c B. Ctrl+d C. Ctrl+k D. Ctrl+f...
  8. java 文件 剪切_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇
  9. vue 嵌套表格组件_vue+element中表格嵌套怎么做?
  10. 医疗影像专用计算机,FCI医疗专用接口满足数码影像需求 -医疗电子-与非网