APUE习题4.6源代码----实现自己的简易 cp 命令

来源:互联网 发布:感人 知乎 编辑:程序博客网 时间:2024/04/30 20:51

原题:

编写一个类似 cp 的程序,它复制包含空洞的文件,但不将字节0写到输出文件中去。

源代码:

#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <string.h>#include <stdlib.h>#define BUF_SIZ 128int my_cp( const char *file1, const char *file2 ){    int fd1, fd2;    char buffer[BUF_SIZ];    int res;    int current_position = 0;    int byte_count = 0;        fd1 = open( file1, O_RDWR );    if( -1 == fd1 ) {        perror("open file1 failed");        return -1;    }    fd2 = open( file2, O_RDWR | O_APPEND | O_CREAT | O_TRUNC, 0666 );    if( -1 == fd2 ) {        perror("open file2 failed");        return -1;    }    memset( buffer, '\0', BUF_SIZ );    res = read( fd1, buffer, BUF_SIZ );    if( -1 == res ) {        perror("file1 read error");        return -1;    }    while( 0 != res ) {        byte_count = 0;        for( current_position=0; current_position<BUF_SIZ; current_position++ ) {            if( '\0' != buffer[current_position] ) {                buffer[byte_count] = buffer[current_position];                byte_count++;            }        }                res = write( fd2, buffer, byte_count );        if( -1 == res ) {            perror("file2 write failed");            return -1;        }        memset( buffer, '\0', BUF_SIZ );        res = read( fd1, buffer, BUF_SIZ );        if( -1 == res ) {            perror("file1 read failed");            return -1;        }    }}int main(int argc, char *argv[]){    if( 3 != argc) {        printf("correct usage: ./my_cp file1 file2\n");        exit( EXIT_FAILURE );    }        //产生一个含有空洞的文件 file1    int fd = open( argv[1], O_RDWR | O_CREAT | O_TRUNC, 0666 );    if( -1 == fd ) {        perror("open failed");        exit( EXIT_FAILURE );    }        int res = write( fd, "Hey,man!", strlen("Hey,man!") );    if( -1 == res ) {        perror("file1 write failed");        exit( EXIT_FAILURE );    }    off_t offset = lseek( fd, 10000, SEEK_SET );    if( -1 == offset ) {        perror("lseek failed");        exit( EXIT_FAILURE );    }    res = write( fd, "How are you?", strlen("How are you?") );    if( -1 ==res ) {        perror("file1 write failed");        exit( EXIT_FAILURE );    }    //应用 my_cp 函数拷贝文件    res = my_cp( argv[1], argv[2] );    if( -1 == res ) {        perror("copy failed");        exit( EXIT_FAILURE );    }    exit( EXIT_SUCCESS );}

运行结果:

[zhang@localhost APUE]$ ./my_cp file1 file2
[zhang@localhost APUE]$ cat file2
Hey,man!How are you?

输出文件在本例中为file2,大小为 20 Bytes = strlen("Hey,man!") + strlen("How are you?")。测试通过。

0 0
原创粉丝点击