mycp

/*2010-09-14*/
/*1 实现一个mycp,功能如同cp
 例如: ./mycp /etc/passwd /tmp/passwd*/
/*
 *打开要被复制的文件1,同时创建一个新的文件2,读文件1到BUF,然后将BUF的内
 *容写到文件2
 * */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc,char** argv)
{
    if(argc!=3)
    {
        perror("argc");
        exit(1);
    }
    int fd1,fd2;
    int ret=1;
    char buf[100];

    fd1=open(argv[1],O_RDONLY);
    if(fd1==-1)
    {
        perror("open");
        exit(1);
    }

    fd2=creat(argv[2],0655);
    if(fd2==-1)
    {
        perror("creat");
        exit(1);
    }

    while(1)
    {
        if(ret==0)
            break;
        ret=read(fd1,buf,99);
        write(fd2,buf,ret);//一边读一边写,(ret)读多少就写多少
    }
   // write(fd2,buf,ret);//不能写在这?!
    close(fd1);
    close(fd2);
    return 0;
}

 

/*2010-09-14*/
/*删除文件里面的特定字符*/
/***************************************************************
 *实现删除文件里面的特定字符,比如将某文件的第6,7个字符删除掉
 *
 * 思路:1、创建一个临时文件 2、用lseek()直接跳过要删除的部分
 * ************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc,char** argv)
{
    if(argc!=2)
    {
        fprintf(stderr,"wrong usage...");
        exit(1);
    }
    int fd1,fd2,fd3;
    int ret;
    int dn=5;
    char buf[100];

    fd1=open(argv[1],O_RDWR);//注意:要以O_RDWR方式打开!
    if(fd1==-1)
    {
        perror("open");
        exit(1);
    }

    fd2=open("copy.txt",O_RDWR | O_CREAT |O_TRUNC, 0644);//作为临时文件
    if(fd2==-1)
    {
        perror("creat");
        exit(1);
    }

    ret=read(fd1,buf,dn);
    write(fd2,buf,ret);//先将要删除位置之前的数据存到临时文件中
    lseek(fd1,2,SEEK_CUR);//直接跳过要删除的那两个数
    while(1)
    {
        ret = read(fd1, buf, 100);
  if (ret == 0)
   break;
  write(fd2, buf, ret);  //将要删除位置后面剩下的数据存到临时文件中
    }
    lseek(fd1,0,SEEK_SET);//让文件指针回到开始处
    lseek(fd2,0,SEEK_SET);
    ret=1;
    while(1)//将临时文件的内容写回到原来的文件中
    {
        ret = read(fd2, buf, 100);
  if (ret == 0)
   break;
  write(fd1, buf, ret);
    }

    sleep(5);//用来测试copy.txt
    close(fd2);
    unlink("copy.txt");
    close(fd1);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值