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.   
  5. int main()  
  6. {  
  7.     FILE *fp;  
  8.     char *file = "tmp";  
  9.     int i;  
  10.     int fd;  
  11.       
  12.     fp = fopen(file, "w");  
  13.     if(fp == NULL)  
  14.     {  
  15.         printf("fopen failed\n");  
  16.         return -1;  
  17.     }  
  18.       
  19.     for(i=0; i<1000; i++)  
  20.     {  
  21.         fprintf(fp, "%d -- abcedfg  \n", i);  
  22.     }  
  23.     fflush(fp);  
  24.   
  25.     fd = fileno(fp);  
  26.     if(ftruncate(fd, 0)<0)  
  27.     {  
  28.         perror("");  
  29.         return -1;  
  30.     }  
  31.     rewind(fp);  
  32.     fprintf(fp, "end\n");  
  33.     fclose(fp);  
  34.     return 0;  
  35. }  

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

- - - - - - - - - -

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

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

时间: 2024-10-23 18:21:38

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

[20141202]改变文件大小与检查点.txt

[20141202]改变文件大小与检查点.txt Resize datafile会触发一个文件级检查点,真的是这样吗?自己做一个测试: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -----------------------------------------------------------------

简要对比C语言中的truncate()函数与ftruncate()函数_C 语言

C语言truncate()函数:改变文件大小头文件: #include <unistd.h> 定义函数: int truncate(const char * path, off_t length); 函数说明:truncate()会将参数path 指定的文件大小改为参数length 指定的大小. 如果原来的文件大小比参数length 大, 则超过的部分会被删去. 返回值:执行成功则返回0, 失败返回-1, 错误原因存于errno. 错误代码: 1.EACCESS 参数path 所指定的文件无法

ext4 mount option data mode: journal ordered writeback

ext4支持3种DATA模式,用来区分记录journal的行为. ext4的journal类似于PostgreSQL的XLOG,可以用来做灾难恢复,以及确保数据的一致性. 文件在ext4中分两部分存储,一部分是文件的metadata,另一部分是data. metadata和data的操作日志journal也是分开管理的.你可以让ext4记录metadata的journal,而不记录data的journal. 这取决于mount ext4时的data参数. 1.  data=journal All

linux下c通过虚拟地址映射读写文件

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<sys/stat.h> #include<string.h> #include<sys/mman.h> struct stu { char name[20]; int age; float score; }; //1 打开文件,2 映射到虚拟地址,3 写入数据

NIO.2 入门,第 2 部分: 文件系统 API

简介: 本文是介绍 More New I/O APIs for the Java Platform(NIO.2)的两部分系列文章的第二部分, 本文涵盖了在新的 java.nio.file 包及其子包中的大部分重要的类与功能. 正如在第一部分 中对 NI0.2 异步通道 API 的讨论,在本文中,作者利用大量的代码示例来论证相关的概念. 本文是介绍 Java 7 中的 More New I/O APIs for Java (NIO.2) 的两部分文章的第二部分. 正如在 第一部分 中探索的异通道

FW中的动画输出的一个小技巧

技巧 问:FW中的动画输出问题,预览时可以方便的转换为50%,200%等,输出的时候却一定得是100%,如果我想转换为 50%,200%输出可以吗? 一:预览时的50%和200%并不是真正改变文件大小,只是查看时用,要真正改变文件大小,你得用modify->image size 二:主菜单file/export preview然后在export preview窗口内,选择左上角的file,scale里%号后,你想输出多少就在这里.可能不一定是最好的方法,但是,管用了.

2Gb or Not 2Gb - File limits in Oracle (Part I)

oracle 2Gb or Not 2Gb - File limits in Oracle   翻译:Kamus(Seraphim) 校正:Bloomit 邮件:kamus@itpub.net 日期:2004-1   经常会听说导入导出的时候,备份恢复的时候,SQL*Loader导入数据的时候,文件超出了2G大小,结果导致错误. 本人文科毕业,什么二进制,十六进制,数据结构,操作系统等等的一概没有学过,所以对此问题一直都只有一个模糊的认识,今天在metalink上面闲逛,忽然发现了这篇文章,兴之

Oracle8i在linux下的安装(中文)

oracle|中文 Oracle8i在linux下的安装(中文)  转摘自flyfox的站点  发布时间:2001年01月04日  详细信息:准备工作--安装Oracle服务器 我认为Microsoft Windows是个不错的操作系统,它在市场方面获得了空前的成功,并造就了盖茨.巴尔默等百亿富翁.它简单易用,得到了广泛地普及,几乎每个计算机爱好者都会操作Windows,几乎每个程序员都会Windows编程.目前为了占领市场,排挤Linux,Windows2000在PC的预装费用从以前Windo

RealPlayer常见问题总结

在电脑上,最为通用的媒体播放器算是RealPlay,不过通常人们只知道它一般的播放功能,如何优化让它工作得更好就很少人知道,还有使用过程中出现的一些普遍问题和如何解决,下面给大家探讨下RealPlay的使用问题和解决方法. 一.设置RealPlayer到最佳工作状态 RealPlayer采用信号流技术(把一个大的媒体文件,如音频.视频等,分解成为较小的若干部分,可以即时节收看,而不用等到全部下载完再观看),可通过某些设置使它达到更好的工作状态. 可以通过在首选项窗口中(从视图菜单中打开)更改设置