23111 IO进程线程 day3

思维导图

1>使用标准IO完成两个文件的拷贝

#include<myhead.h>


int main(int argc, const char *argv[])
{
    //判断文件个数
    if(argc!=3)
    {
        printf("input file error\n");
        printf("usage:./a.out srcfile dstfile\n");
        return 0;
    }

         //定义两个文件指针
    FILE *srcfp=NULL;   //源文件指针
    FILE *dstfp=NULL;   //目标文件指针
 
    //以只读的形式打开源文件
    if((srcfp=fopen(argv[1],"r"))==NULL)
    {
        perror("fopen 1 error");
        return -1;
    }

    //以只写的形式打开目标文件
    if((dstfp=fopen(argv[2],"w"))==NULL)
    {
        perror("fopen 2 error");
        return -1;
    }

 //循环到光标在文件末尾处结束
    while(!feof(srcfp))
    {
        char buf[10]="";
        //读取文件内容
        int res=fread(buf,1,sizeof(buf),srcfp);

        //拷贝文件
        fwrite(buf,1,res,dstfp);
    }
    //关闭文件
    fclose(srcfp);
    fclose(dstfp);
    return 0;
}


2>使用文件lO完成两个文件的拷贝

#include<myhead.h>


int main(int argc, const char *argv[])
{
    if(argc!=3)
    {
        printf("input file error\n");
        printf("usage: ./a.out srcfile dstfile");
        return 0;
    }

    //定义文件描述符变量
    int rfp=-1;
    int wfp=-1;

    //以只读的方式打开文件
    if((rfp=open(argv[1],O_RDONLY,0664))==-1)
    {
        perror("open 1 error");
        return -1;
    }

    //以只写的形式打开文件
    if((wfp=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
    {
        perror("open 2 error");
        return -1;
    }

    char buf[10]="";
    int res;

    while((res=read(rfp,buf,sizeof(buf)))!=0)
    {
        write(wfp,buf,res);
    }

    //关闭文件
    close(rfp);
    close(wfp);
    
    return 0;
}

3>将stat函数实现一遍

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //判断外部传参的个数
    if(argc != 2)
    {
        write(2, "input file error\n", strlen("input file error\n"));
        write(2, "usage:./a.out filename\n", strlen("usage:./a.out filename\n"));
        return -1;
    }

    //定义文件状态结构体变量,用于返回文件信息
    struct stat st;
    //调用函数,获取给定的文件状态
    if(stat(argv[1], &st) == -1)
    {
        perror("stat error");
        return -1;
    }

    //如果程序执行到此,说明st中已经存放了指定文件的信息
    switch(st.st_mode&S_IFMT)
    {
    case S_IFSOCK:
        printf("这是一个套接字文件\n");
        break;

    case S_IFLNK:
        printf("这是一个链接文件\n");
        break;


    case S_IFREG:
        printf("这是一个普通文件文件\n");
        break;

    case S_IFBLK:
        printf("这是一个块设备文件文件\n");
        break;

    case S_IFDIR:
        printf("这是一个目录文件\n");
        break;

    case S_IFCHR:
        printf("这是一个字符设备文件\n");
        break;

    case S_IFIFO:
        printf("这是一个管道文件\n");
        break;
    }

    printf("文件权限为:%#o\n", st.st_mode&0777);   //得到文件权限
    printf("inode: %ld\n", st.st_ino);           //文件inode号
    printf("文件大小为:%ld\n", st.st_size);        //文件大小

    return 0;
}


4>将目录操作实现一遍

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //判断外部传参个数
    if(argc != 2)
    {
        printf("input error\n");
        printf("usage:./a.out name\n");
        return -1;
    }

    //定义目录指针
    DIR *dp = NULL;
    //打开目录
    if((dp = opendir(argv[1])) == NULL)
    {
        perror("opendir error");
        return -1;
    }

    //读取目录中的文件或目录信息
    struct dirent *sdp = NULL;
    while((sdp = readdir(dp)) != NULL)
    {
        //输出当前文件或目录的信息
        printf("inode:%10ld, size:%10d, %10s, ",\
                sdp->d_ino, sdp->d_reclen, sdp->d_name);

        //输出类型
        switch(sdp->d_type)
        {
        case DT_BLK:
            {
                printf("b\n");
            }
            break;
        case DT_CHR:
            {
                printf("c\n");
            }
            break;

        case DT_DIR:
            {
                printf("d\n");
            }
            break;

        case DT_FIFO:
            {
                printf("p\n");
            }
            break;
        case DT_LNK:
            {
                printf("l\n");
            }
            break;
        case DT_REG:
            {
                printf("-\n");
            }
            break;
        case DT_SOCK:
            {
                printf("s\n");
            }
            break;
        }
    }

    //关闭目录
    closedir(dp);

    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值