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