高效率删除文本文件的最后一行

一个大型文件(总之不<wbr>小),要求删除该文件<wbr>的最后一行,求一种效<wbr>率比较高的解决方法。</wbr></wbr></wbr>

测试用的文本文件800M
1.用sed解决,此法最易想,但也是最笨的一个,
<wbr>解决方法来自问题的提出者:<br> sed -e '$d' input.file &gt; output.file<br> 用time测试了一下,效率是相当的低!<br> real    2m51.099s<br> user    2m1.268s<br> sys    0m4.260s<br> 2.用head解决,此法比sed有一个质的的提升,<wbr>提升来自增大了缓存,不过依然没有抓住问题的本质,<wbr>还是做了不少无用功!解决方法来时cu上的热心网友。<br> head -n-1 input.file &gt; output.file<br> real    0m23.687s<br> user    0m0.212s<br> sys    0m4.668s<br> 3.用vim解决,此法很别处心裁,<wbr>这应该是遇到这个问题的最先想到的一种。<wbr>解决方法来自我加的unix like群里的一个叫石仔的管理员!<br> vim + result<br> dd<br> 这个没测试,感觉效率和head法差不多,加载太慢!<br> 4.重量级要到场了,感谢cu版主的这个脚本,<wbr>只能用四个字形容!五体投地!<br> :|dd of=input.file seek=1 bs=$(($(find input.file -printf "%s")-$(tail -1 input.file|wc -c)))<br> 或者是<br><font face="FixedSys ">:|dd of=input.file seek=1 bs=$(($(stat -c%s input.file)-$(tail -1 input.file|wc -c)))</font><br> 测试了一下!<br> real    0m0.123s<br> user    0m0.004s<br> sys    0m0.012s<br> 5.感觉这个用c写效率最高,但显然,代码也是最长的,<wbr>我实现了代码,<br> 测试了一下,<br> real    0m0.002s<br> user    0m0.000s<br> sys    0m0.000s<br> 代码如下:<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>

#define GUESS_LINE_SIZE 80
int get_line_size(char *ptr);

int
main(int argc, char *argv[])
{
    char buf[GUESS_LINE_SIZE];
    int line_len, fd;
    struct stat stat_buf;
   
    fd = open(argv[1], O_RDWR);
    lstat(argv[1], &stat_buf);
    lseek(fd, -GUESS_LINE_SIZE, SEEK_END);
    read(fd, buf, GUESS_LINE_SIZE) ;
    line_len = get_line_size(buf);
    truncate(argv[1], stat_buf.st_size - line_len);
   
    exit(0);
}

int
get_line_size(char *ptr)
{
    int line_len = 0, i = GUESS_LINE_SIZE - 2;/*buf中的最后一个字符为'\n'*/
   
    while (*(ptr + i) != '\n') {
        //printf("%c", *(ptr + i));

        i--;
        line_len++;
    }
    return line_len;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值