• APUE 第4章: cp命令实现,同时去除文件中的空洞


    在apue第65页有一个用lseek函数制造文件空洞的程序,贴在下面:

    #include "apue.h"
    #include

    char buf1[] = "abcdefghij";
    char buf2[] = "ABCDEFGHIJ";

    int main(void){
        int fd;
        if((fd = creat("file.hole", FILE_MODE)) <0)
            err_sys("creat error");

        if(write(fd, buf1, 10)!=10)
            err_sys("buf1 write error");

        if(lseek(fd, 16384, SEEK_SET) == -1)
            err_sys("lseek error");

        if(write(fd, buf2, 10)!=10)
            err_sys("buf2 write error");

        exit(0);
    }


    lseek指针往后偏移16384个字节,里面都是'\0'.:

    linux@linux:~/apue/c4$ od -c ../c3/file.hole
    0000000   a   b   c   d   e   f   g   h   i   j  \0  \0  \0  \0  \0  \0
    0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
    *
    0040000   A   B   C   D   E   F   G   H   I   J
    0040012
     

    apue第4章第6题: 编写一个类似cp(1)的程序,它复制包含空洞的文件,但不将字节0写到输出文件中去.

    分析:用read函数读1个字节,写入到buf中去,如果buf[0] == '\0' ,丢弃.

    实现如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main(int argc, const char *argv[])
    6. {
    7. char buf[1];
    8. int read_fd;
    9. int write_fd;
    10. if(argc != 2){
    11. perror("input");exit(1);
    12. }
    13. if((read_fd = open(argv[1], O_RDONLY)) < 0){
    14. perror("read open");exit(1);
    15. }
    16. if((write_fd = open("newfile", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR |S_IWUSR |S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH))<0){
    17. perror("write open");exit(1);
    18. }
    19. while(read(read_fd, buf, 1)==1){
    20. if(buf[0] == '\0') continue;
    21. write(write_fd, buf,1);
    22. }
    23. close(read_fd);
    24. close(write_fd);
    25. return 0;
    26. }

    实现的结果

    原来:
    linux@linux:~/apue/c4$ od -c ../c3/file.hole
    0000000   a   b   c   d   e   f   g   h   i   j  \0  \0  \0  \0  \0  \0
    0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
    *
    0040000   A   B   C   D   E   F   G   H   I   J
    0040012

    现在
    linux@linux:~/apue/c4$ cat newfile
    abcdefghijABCDEFGHIJ   linux@linux:~/apue/c4$ ls -l newfile
    -rw-rw-r-- 1 linux linux 20 Jul 27 21:43 newfile
     

    用到的知识点 p 99 - p 100 ,read读到的空洞为字节0

  • 相关阅读:
    【数据标注】Label Studio用于机器学习标注
    php mysql
    首款国产科学计算软件:北大天元,个人测试与感受
    C++函数模板
    Android 阿里云OSS 上传文件,使外网可以直接访问
    c++ SFML ftp删除文件
    【KD】2022 ECCV Factorizing Knowledge in Neural Networks
    拥抱 OpenAPI 3:springdoc-openapi 食用指南
    Element-UI el-select下拉框多选实现全选
    confluent-kafka-go依赖库编译体验优化
  • 原文地址:https://blog.csdn.net/m0_47161778/article/details/126028345