• 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;
    }
     

  • 相关阅读:
    Apache Druid连接回收引发的血案
    海康、大华等IPC解码上墙,PC上平台同时查看方案
    代码随想录day31|开始贪心咯|贪心理论|455.分发饼干|376. 摆动序列|53. 最大子序和|复习day2|Golang
    计算机毕业设计Java大众采编本微资讯发布平台(源码+系统+mysql数据库+lw文档)
    水库大坝安全评价导则:大坝运行管理评价
    2023Web前端开发八股文&面试题(万字系列)——这篇就够了!
    支付功能、支付平台、支持渠道如何测试?
    Kafka Stream 学习笔记-5 process api
    C++中的内存管理
    An overview of IfM Engage
  • 原文地址:https://blog.csdn.net/m0_73943160/article/details/127841050