Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)

转载:http://blog.csdn.net/a_ran/article/details/43562429

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

将文件大小改变为参数length指定的大小,如果原来的文件大小比参数length大,则超过的部分会被删除,如果原来的文件大小比参数length小,则文件将被扩展,

与lseek系统调用类似,文件的扩展部分将以0填充。如果文件的大小被改变了,则文件的st_time 和st_ctime将会更新。

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.

打开的文件清空,然后重新写入的需求,但是使用 ftruncate(fd, 0)后,并没有达到效果,反而文件头部有了‘\0‘,长度比预想的大了。

究其原因是没有使用 lseek 重置文件偏移量

int fd;

const char *s1 = "0123456789";
const char *s2 = "abcde";

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

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

ftruncate(fd, 0);
lseek(fd, 0, SEEK_SET);

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

close(fd);

return 0;

//先清空文件,再设置文件偏移量,否则会产生文件空洞

ftruncate(fd, 0); 
lseek(fd, 0, SEEK_SET);

时间: 2024-10-26 15:10:44

Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)的相关文章

linux几种快速清空文件内容的方法

linux几种快速清空文件内容的方法 几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo "" > filename $ echo /dev/null > filename $ echo > filename $ cat /dev/null > filename

23、Linux truncate ftruncate函数

truncate ftruncate函数 truncate()和ftruncate()都可以用来修改文件大小,但两者之间也有一些区别. 一.truncate()函数 头文件: #include <unistd.h> 函数定义: int truncate(const char *path, off_t length); 函数调用: truncate("/aaa",500); 函数说明: truncate()会将参数path指定的文件大小改为参数length指定的大小. 如果原

linux几种快速清空文件内容的方法:

几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo “” > filename $ echo /dev/null > filename $ echo > filename $ cat /dev/null > filename 原文地址:https://www.cnblogs.com/saffibai/p/12246568.html

fileno, ftruncate函数

转载: http://blog.csdn.net/xiaoyangger/article/details/5237016 fileno()函数 功    能:把文件流指针转换成文件描述符相关函数:open, fopen表头文件:#include <stdio.h>定义函数:int fileno(FILE *stream)函数说明:fileno()用来取得参数stream指定的文件流所使用的文件描述词返回值  :返回和stream文件流对应的文件描述符.如果失败,返回-1.范例:#include

Linux清空文件内容方法

Linux快速清空文件内容的方法 方法1 [[email protected] ~]# > filename 方法2 [[email protected] ~]# cat /dev/null > filename 方法3 [[email protected] ~]# echo /dev/null > filename 方法4 [[email protected] ~]# : > filename 注释:":"是一个占位符,不产生任何输出 方法5 [[email 

〖Linux〗上传单个文件到FTP的Shell命令行(函数)

1 #!/bin/bash - 2 #=============================================================================== 3 # 4 # FILE: ftp_put_file.sh 5 # 6 # USAGE: ./ftp_put_file.sh 7 # 8 # DESCRIPTION: 9 # 10 # OPTIONS: --- 11 # REQUIREMENTS: --- 12 # BUGS: --- 13 # NO

linux下用scp命令在两个服务器之间传输文件,利用php_scp函数进行文件传输

在linux下利用scp进行文件传输, 从服务器下载文件 scp [email protected]:/path/filename /path/filename 上传本地文件到服务器 scp /path/filename [email protected]:/path/filename 从服务器下载整个目录 scp -r [email protected]:remote_dir/ /path/ 上传目录到服务器       scp -r /dir [email protected]:remote

Linux中如何清空文件

经常会碰到查看日志文件,如果日志文件太大,用less,more,vi,tail命令查看起来会比较麻烦,也挺难定位到具体错误,而定期备份,定期清空应该是好主意,当然清空之前必须备份.要是日志文件本身不存在,用mkdir可以建个空文件,但系统程序已经在调用,那么要如何清空其中文件,其实挺简单: 方法一: # cat /dev/null > error.log 方法二: # echo "" | tee error.log 方法三: # truncate -s error.log NOT

linux快速清空文件 比如log日志

linux中快速清空文件内容的几种方法这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 权限要求: 至少执行用户对该文件有写的权限 --w------- 1 QA_Deploy QA_Deploy       1 Jun 27 17:35 test.out $ : > filename $ > filename $ echo "" > filename $ echo > filename 是不是第二种最简单,直接> filen