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

  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 则正常.

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

  1. LINUX改变文件大小

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  2. unix IO笔记

    一.IO与文件映射 1.IO的共享与效率 read与write其中数据缓冲的大小 读取数据的缓冲:getpagesize 2.定位与定位读取(随机读取) read与write在操作的时候,自动移动读取 ...

  3. C语言编程积累2

    版权声明:本文为CSDN博主(天才2012)原创文章,未经博主同意不得转载. https://blog.csdn.net/gzzaigcn/article/details/27113957 寥寥数笔, ...

  4. [非常重要的总结] Linux C相关函数

    (1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...

  5. Linux C函数库参考手册

    目录 第1章 字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ascii码字符) isblank(测试字符是否为空 ...

  6. [置顶] linux c常用函数 (待完善)

    (1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...

  7. Linux C函数库大全

    (1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...

  8. linux c库函数大全

    Linux C函数库参考手册  [转自ChinaUnix]第1章字符测试函数isalnum(测试字符是否为英文字母或数字)isalpha(测试字符是否为英文字母)isascii(测试字符是否为ASCI ...

  9. C 语言函数手册:涵盖字符测试、字符串操作、内存管理、时间换算、数学计算、文件操作、进程管理、文件权限控制、信号处理、接口处理、环境变量、终端控制

    1. 字符测试函数 函数 说明 isascii() 判断字符是否为ASCII码字符 2. 字符串操作 函数 说明 gcvt() 将浮点型数转换为字符串(四舍五入) index() 查找字符串并返回首次 ...

随机推荐

  1. 【BZOJ2159】Crash的文明世界(第二类斯特林数,动态规划)

    [BZOJ2159]Crash的文明世界(第二类斯特林数,动态规划) 题面 BZOJ 洛谷 题解 看到\(k\)次方的式子就可以往二项式的展开上面考,但是显然这样子的复杂度会有一个\(O(k^2)\) ...

  2. 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)

    [BZOJ4813][CQOI2017]小Q的棋盘(贪心) 题面 BZOJ 洛谷 题解 果然是老年选手了,这种题都不会做了.... 先想想一个点如果被访问过只有两种情况,第一种是进入了这个点所在的子树 ...

  3. 洛谷 P3871 [TJOI2010]中位数 解题报告

    P3871 [TJOI2010]中位数 题目描述 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前 ...

  4. asp 调用 vb(activex dll) ,参数传递(传引用)需要注意

    今天上午测试 vb 与 c(dll) 之间交互,传递参数的时候,没遇到什么太大的问题. 下午在asp中调用vb(activex dll)时, 在asp代码中传参数到 vb(dll)中时,遇到问题了. ...

  5. mac subLime3 JSON 格式化插件安装

    1.首先找到路径:/Users/hou***in/Library/Application' 'Support/Sublime' 'Text' '3/Packages/ 2.git clone http ...

  6. C# BindingSource

    1.引言 BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用.使用这些API我们可以将Code与各种具体类型数据源进行解耦:使用这些Event我们可以 ...

  7. Python pickle模块

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  8. Java连接访问Oracle--Connection.setSavepoint()方法使用

    使用时有一个重要前提:你不能使用oracle的classes12.jar,需要把oracle的jdbc驱动替换成ojdbc14.jar,否则savepoint()功能不能使用(出现“abstract方 ...

  9. Jenkins发送邮件

    Jenkins发送邮件 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.配置并发执行任务数量 1>.点击系统管理 2>.点击系统设置 3>.修改执行者数量为: ...

  10. Scala进阶之路-尾递归优化

    Scala进阶之路-尾递归优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 递归调用有时候能被转换成循环,这样能节约栈空间.在函数式编程中,这是很重要的,我们通常会使用递归方法来 ...