原题:
编写一个类似 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 ); }
运行结果:
[[email protected] APUE]$ ./my_cp file1 file2
[[email protected] APUE]$ cat file2
Hey,man!How are you?
输出文件在本例中为file2,大小为 20 Bytes = strlen("Hey,man!") + strlen("How are you?")。测试通过。
时间: 2024-11-05 17:29:10