ftruncate(改变文件大小)

ftruncate(改变文件大小)

定义函数 int ftruncate(int fd,off_t length);

函数说明

ftruncate()会将参数fd指定的文件大小改为参数length指定的大小。

参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。

如果原来的文件大小比参数length大,则超过的部分会被删去。

返回值

执行成功则返回0,失败返回-1,错误原因存于errno

错误代码

EBADF 参数fd文件描述词为无效的或该文件已关闭。

EINVAL 参数fd 为一socket 并非文件,或是该文件并非以写入模式打开。

今天用 ftruncate 截断文件, 但怎么都不能达到预料的效果, 截断后文件中的内容比较杂, 而且文件大小也保持原来的.

添加 fflush() 和 rewind() 后OK.

以下是测试代码:

http://blog.csdn.net/dengzhaoqun/article/details/7962704

[cpp] view plaincopy

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int main()
  5. {
  6. FILE *fp;
  7. char *file = "tmp";
  8. int i;
  9. int fd;
  10. fp = fopen(file, "w");
  11. if(fp == NULL)
  12. {
  13. printf("fopen failed\n");
  14. return -1;
  15. }
  16. for(i=0; i<1000; i++)
  17. {
  18. fprintf(fp, "%d -- abcedfg  \n", i);
  19. }
  20. fflush(fp);
  21. fd = fileno(fp);
  22. if(ftruncate(fd, 0)<0)
  23. {
  24. perror("");
  25. return -1;
  26. }
  27. rewind(fp);
  28. fprintf(fp, "end\n");
  29. fclose(fp);
  30. return 0;
  31. }

程序运行后, tmp 文件的内容为 end , 大小为4字节.

- - - - - - - - - -

在调用 ftruncate() 前用 rewind() 也行.

但用 ftruncate()截断过的文件, 在用 fread, fwrite拷贝到另外一个文件时, 会出现乱码和一些‘\0‘字符. 改用 fgets 和 fputs 则正常.

时间: 2024-10-03 23:04:34

ftruncate(改变文件大小)的相关文章

linux c常用函数

(1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) iscntrl(测试字符是否为ASCII码的控制字符) isdigit(测试字符是否为阿拉伯数字) isgraph(测试字符是否为可打印字符) islower(测试字符是否为小写英文字母) isprint(测试字符是否为可打印字符) isspace(测试字符是否为空格字符) ispunct(测试字

Linux C函数库大全

(1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) iscntrl(测试字符是否为ASCII码的控制字符) isdigit(测试字符是否为阿拉伯数字) isgraph(测试字符是否为可打印字符) islower(测试字符是否为小写英文字母) isprint(测试字符是否为可打印字符) isspace(测试字符是否为空格字符) ispunct(测试字

C语言编程积累2

寥寥数笔,记录我的C语言盲点笔记,只为曾经经历过,亦有误,可交流. 1.implict declartion of function 指的是在预处理时没有函数的申明,但该函数在别的函数中进行了编译与调用,编译可以完成链接但是会给出warning,需要提前申明 2. sizeof是一个operand操作符,不能直接对其进行&取地址操作.是一个编译器自动算大小的函数,在预处理时.和宏定义有所类似. sizeof当然不是函数,它是编译的时候处理的编译时,编译器推断出sizeof参数的类型,sizeof

linux C 函数库

第1章字符测试函数 1 isalnum(测试字符是否为英文字母或数字) 2 isalpha(测试字符是否为英文字母) 3 isascii(测试字符是否为ASCII码字符) 4 isblank(测试字符是否为空格字符) 5 iscntrl(测试字符是否为ASCII码的控制字符) 6 isdigit(测试字符是否为阿拉伯数字) 7 isgraph(测试字符是否为可打印字符) 8 islower(测试字符是否为小写英文字母) 9 isprint(测试字符是否为可打印字符) 10 isspace(测试字

文件权限控制篇access alphasort chdir chmod chown chroot closedir fchdir fchmod fchown fstat ftruncate getcwd

access(判断是否具有存取文件的权限) 相关函数 stat,open,chmod,chown,setuid,setgid 表头文件 #include<unistd.h> 定义函数 int access(const char * pathname,int mode); 函数说明 access()会检查是否可以读/写某一已存在的文件.参数mode有几种情况组合,R_OK,W_OK,X_OK 和F_OK.R_OK,W_OK与X_OK用来检查文件是否具有读取.写入和执行的权限.F_OK则是用来判断

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

总结文件操作函数(二)-C语言

格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf(stdout,format,-); int scanf(const char *format, -); int fprintf(FILE *stream, const char *format, ...);      //中间的参数为写入文件的格式 int fscanf(FILE *stream, const

基于文件描述符的文件操作(非缓冲)

1.1. 文件描述符:内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0-1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作.常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权限).flock(加锁).fcnt

【APUE】Chapter14 Advanced I/O

14.1 Introduction 这一章介绍的内容主要有nonblocking I/O, record locking, I/O multiplexing, asynchronous I/O, the readv and writev, memory-mapped I/O 这一章是后面章节的基础,也就是说先当成基础记着,在后面的实操应用章节再去体会. 14.2 Nonblocking I/O "blocking"主要针对slow system call,含义是“the slow sy