首页 > 代码库 > APUE习题4.6源代码----实现自己的简易 cp 命令
APUE习题4.6源代码----实现自己的简易 cp 命令
原题:
编写一个类似 cp 的程序,它复制包含空洞的文件,但不将字节0写到输出文件中去。
源代码:
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> #define BUF_SIZ 128 int 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?")。测试通过。
APUE习题4.6源代码----实现自己的简易 cp 命令
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。