• IO:作业:线程:2. 要求用线程拷贝一张图片,一个线程拷贝前半部分,另一个线程拷贝后半部分


    #include
    #include
    #include
    #include
    #include
    //一个全局变量用于判断执行先后顺序
    int flag=0;//作为程序执行的条件
    //创建全局变量,以创建清空写入的方法
    FILE *fo_dw=NULL;
    //子线程的执行体
    //拷贝后半部分
    void *pth_next(void *arg)
    {
        while(1)
        {
            if(flag==1)
            {
                //计算打开文件的大小
                int ls_1=fseek((FILE *)arg,0,SEEK_END);
                long int sum=ftell((FILE *)arg);
                int half=sum/2;//获取光标到一半
                int remainder=sum%2;//判断文件奇偶性
                //变量
                int get_r;
                int put_w;
                //光标移动到中间加奇偶性的位置
                fseek((FILE *)arg,half+remainder,SEEK_SET);
                printf("%p\n",fo_dw);
                if(fseek(fo_dw,half+remainder,SEEK_SET)<0)
                {
                    printf("错误\n");
                    return NULL;
                }
                printf("%ld \n",ftell((FILE *)arg));
                while(1)
                {
                    //获取单个字符
                    get_r=fgetc((FILE *)arg);
                    if(get_r<0)
                    {
                        printf("读取结束\n");
                        break;
                    }
                    //将字符写入到fo_dw里
                    put_w=fputc(get_r,fo_dw);
                    if(put_w<0)
                    {
                        printf("写入失败\n");
                        return NULL;
                    }
                }
                flag=2;    
                printf("%d\n",flag);
            }
            if(flag==2)
                return NULL;
        }
    }
    int main(int argc, const char *argv[])
    {
        //打开清空或创建文件
        fo_dw=fopen("./cp.png","w");
        if(fo_dw==NULL)
        {
            perror("fopen_w");
            return -1;
        }
        printf("打开成功\n");
        //打开图片文件以只读方式
        if(argc<2)
        {
            printf("没有要读取的图片文件名\n");
            return -1;
        }
        FILE *fo_r=fopen(argv[1],"r");
        if(fo_r==NULL)
        {
            perror("fopen_r");
            return -1;
        }
        printf("打开只读成功\n");
        //创建一个线程
        pthread_t pth;
        int pt;
        pt = pthread_create(&pth,NULL,pth_next,fo_r);
        if(pt!=0)
        {
            perror("pthread_create");
            return -1;
        }
        printf("创建成功\n");
        //实现功能,拷贝图片前半部分
        while(1)
        {
            if(flag==0)//条件成立才执行
            {
                //计算打开文件的大小
                int ls_1=fseek(fo_r,0,SEEK_END);
                long int sum=ftell(fo_r);
                int half=sum/2;
                int remainder=sum%2;
                //变量
                int get_r=0;
                //光标移动到开头
                fseek(fo_r,0,SEEK_SET);
                fseek(fo_dw,0,SEEK_SET);
                int i=0;//循环变量
                for(i=0;i<(half+remainder);i++)
                {
                    //获取单个字符
                    get_r=fgetc(fo_r);
                    if(get_r<0)
                    {
                        printf("读取错误\n");
                        return -1;
                    }
                    //将字符写入到fo_dw里
                    fputc(get_r,fo_dw);
                }
                flag=1;
                //printf("%d\n",flag);
            }
            if(flag==2)
            {
                fclose(fo_r);//关掉读取
                fclose(fo_dw);//关掉写入
                return 0;
            }

        }
        //sleep(5);
        return 0;
    }
     

  • 相关阅读:
    数学建模:灰色预测模型
    【Leetcode】805. Split Array With Same Average
    【初阶与进阶C++详解】第九篇:vector
    迅为IMX6开发板QT系统LVDS和HDMI双屏异显和同显
    罗马和汉朝的对比
    基于PCIe的NVMe协议在FPGA中实现方法
    条码管理操作手册
    【哈士奇赠书活动 - 41期】- 〖产品设计软技能:创业公司篇〗
    【Jmeter】安装配置:Jmeter 安装插件 JSON/YAML Plugins (deprecated)
    Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单
  • 原文地址:https://blog.csdn.net/m0_73943160/article/details/127841050