2019苏嵌寒假集训01

2019.01.12

今天主要学了 系统调用的文件访问和C语言库函数的文件访问。其中有很多要点。

1.在对文件进行操作的时候要加一个if判断是否出错

    fd = creat("/home/xxx/hello.c", S_IRUSR | S_IWUSR);  //文件名(路径)  文件的权限
    if (-1 == fd)   //返回-1表示出错
    {
        printf("%d\n", errno);
        perror("creat"); 
        exit(1);  //记得要加相关的头文件
    }

2.读文件里的内容时,缓存区的大小减一,因为字符串最后以\0结尾,不然有可能产生乱码

ret = read(fd_from, buf, sizeof(buf) - 1);

3.读文件内容要把文件指针移到文件开始的位置,不然读的是文件内容以后空的数据

//lseek(fd, 0, SEEK_SET);   //相对文件开头移动0个字节
    //lseek(fd, strlen(buf) * -1, SEEK_CUR);  //相对当前位置,向前移动xxx个字节
    lseek(fd, strlen(buf) * -1, SEEK_END);    //相对文件末尾,向前移动xxx个字节

fseek(fp, 0, SEEK_SET);  //移动文件指针,相对文件开头移动0个字节

4.在进行缓存区操作后要将缓存区清空

    memset(buf, 0, sizeof(buf));

    close(fd_from);
    close(fd_to);

5.用ftell可以得到文件大小

length = ftell(fp);       //返回文件指针距离文件开头的长度

 

疑惑:

拷贝这一段死循环 为什么是ret = write(fd_to, buf, ret);?而不是write(fd_to, buf, ret) = ret;

while (1)
    {
        ret = read(fd_from, buf, sizeof(buf) - 1);
        if (ret == -1)
        {
            perror("read");
        }
        else if (0 == ret)   //文件读完
        {
            printf("拷贝完毕!\n");
            break;
        }

        ret = write(fd_to, buf, ret);
        if (-1 == ret)
        {
            perror("write");
        }

        memset(buf, 0, sizeof(buf));
    }

你可能感兴趣的:(2019苏嵌寒假集训01)