• 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 ");  
    16.         return -1;  
    17.     }  
    18.       
    19.     for(i=0; i<1000; i++)  
    20.     {  
    21.         fprintf(fp, "%d -- abcedfg   ", 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 ");  
    33.     fclose(fp);  
    34.     return 0;  
    35. }  

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

    - - - - - - - - - -

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

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

  • 相关阅读:
    MyBatis通过Mapper动态代理来实现curd操作
    通过Mybatis原始Dao来实现curd操作
    MyBatis最原始的实现curd的操作
    通过重写request.getParameter方法来解决中文乱码问题。
    第九章:Servlet工作原理解析
    简述servlet
    Java中几个常用并发队列比较 | Baeldung
    记录java程序一次CPU占用90%问题排查过程
    日志查看
    mongo
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4663630.html
Copyright © 2020-2023  润新知