IO线程进程之文件IO

1、文件IO的open、close

//关于文件IO中open和close操作
#include <myhead.h>
int main(int argc, const char *argv[])
{
    //定义文件描述符
    int fd;
    //以只读的方式打开文件,并且创建文件
    if((fd=open("./hello,txt",O_WRONLY|O_CREAT|O_EXCL,0664))==-1)
    {
        //判断什么原因出错
        if(errno==EEXIST)
        {
            printf("文件已经存在,无需重新创建,直接打开即可\n");
            fd=open("./hello.txt",O_WRONLY|O_TRUNC);
        }else
        {
            perror("open error");
            return -1;
        }
    }

    //输出该文件的文件描述符
    printf("fd=%d\n",fd);

    //关闭文件
    if(close(fd)==0)                                                  
    {
        printf("文件关闭成功\n");
    }else
    {
        perror("close error");
    }

    return 0;
}
                                                                      
                                                                      

运行结果

 

 2、文件IO的read、write

//关于文件IO的read和write
//使用read、write完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
    //判断文件传输个数
    if(argc!=3)
    {
        printf("input file error\n");
        printf("usage:./a.out srcfile destfile\n");
    }

    //定义两个文件描述符
    int srcfd;                 //文件描述符为整数,并且遵循最小未使用原则
    //以只读的方式打开源文件
    if((srcfd=open(argv[1],O_RDONLY))==-1)
    {
        perror("open srcfile error");
        return -1;
    }

    int destfd;
    //以只写的方式打开目标文件,并创建
    if((destfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
    {
        perror("open destfile error");
        return -1;
    }                                                                           

    //定义搬运工
    char buf[128]="";
    int ret =0;
    while((ret=read(srcfd,buf,sizeof(buf)))>0)
    {
        //将读取的数据写入新文件中
        write(destfd,buf,ret);
    }

    printf("拷贝成功\n");

    //关闭文件
    close(srcfd);
    close(destfd);
    return 0;
}

3、文件IO的lseek

使用lseek读取图像的大小,并更改图像
//文件IO的光标移动操作(lseek)
//使用lseek读取图像的大小,并更改图像
#include <myhead.h>
int main(int argc, const char *argv[])
{
    //定义文件描述符
    int fd;
    if((fd=open("./sanzi.bmp",O_RDWR))==-1)
    {
        perror("open error");
        return -1;
    }
    unsigned int SIZE=lseek(fd,0,SEEK_END);
    printf("size = %d\n",SIZE);

    //定义颜色
    unsigned char color[3]={255,255,0};

    //定位光标
    lseek(fd,54,SEEK_SET);
    for(int i=0;i<400;i++)
    {
        for(int j=0;j<500;j++)
        {
            write(fd,color,sizeof(color));
        }
    }
    //关闭文件
    close(fd);

    return 0;
}
                                                    
                                                    

 

 

 4、目录的操作(opendir、closedir)

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //定义目录指针
    DIR *dp;

    //打开一个目录
    if((dp = opendir("./")) == NULL)
    {
        perror("opendir error");
        return -1;
    }

    //定义遍历指针,将所有文件进行遍历
    struct dirent *q = NULL;
    while((q=readdir(dp)) != NULL)
    {
        //输出当前遍历到的文件信息
        printf("name = %10s\tinode = %ld\tsize = %d\t, type = %#o\t",\
                q->d_name, q->d_ino, q->d_reclen, q->d_type);

        switch(q->d_type)
        {
        case DT_BLK:
            {
                printf("块设备文件\n");
            }
            break;
        case DT_CHR:
            {
                printf("字符设备文件\n");
            }
            break;
        case DT_DIR:
            {
                printf("目录文件\n");
            }
            break;
        case DT_FIFO:
            {
                printf("管道文件\n");
            }
            break;
        case DT_LNK:
            {
                printf("链接文件\n");
            }
            break;
        case DT_REG:
            {
                printf("普通文件\n");
            }
            break;
        case DT_SOCK:
            {
                printf("套接字文件\n");
            }
            break;
        default:printf("不知名文件\n");

        }
    }



    //关闭目录
    closedir(dp);

    return 0;
}

 5、文件IO思维导图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值