c语言指定大小分割文件,C语言实现智能文件分割

#include

#include

#include "windows.h"

#include

using namespace std;

char* char_catch(char* str)

{

char*

a = "第";

char*  b = "章";

char *i = NULL;

char *temp = NULL;

int n;

int p;

std::vector

myList;

i = str;

while(1)

{

temp =  strstr(i,a);

if (NULL != temp)

{

myList.push_back(temp);

i = temp + 2;

temp = NULL;

}

else

{

break;

}

}

while (!myList.empty())

{

temp = i = myList.back();

BOOL bFlag = FALSE;

for(n=0;n<16;n++)

{

p = strncmp(i,b,2);

if(0 == p)

{

bFlag = TRUE;

break;

}

else

{

i++;

continue;

}

}

if (bFlag == TRUE)

{

return temp;

}

myList.pop_back();

}

return

temp;

}

void rwfile(FILE * iFile, FILE * oFile, int size)

{

char buf[4096] = {0};

int readsize = 0;

while(1)

{

if (size > 4096)

{

readsize =

4096;

}

else

{

readsize =

size;

}

fread(buf, readsize, 1,

iFile);

fwrite(buf, readsize, 1, oFile);

size -= readsize;

if (size == 0)

{

break;

}

}

}

int  domore(FILE * ifp, FILE * ofp, int

FragSize, int cur)

{

char * str = NULL;

char * i = NULL;

int m = 0;

int len = 0;

int lLen = 0;

int readsize = 0;

str = (char*)malloc(FragSize + 1);

if (NULL == str)

{

return 0;

}

lLen = cur + FragSize;

fseek(ifp, lLen,SEEK_SET);

for(m=0; m < 20; m++)

{

readsize = fread(str,1, FragSize,ifp);

str[FragSize] = '\0';

i = char_catch(str);

if(i)

{

len = lLen + i - str - cur;

fseek(ifp, cur,SEEK_SET);

rwfile(ifp, ofp, len);

cur += len;

break;

}

else

{

if (readsize < FragSize)

{

break;

}

lLen += FragSize;

continue;

}

}

return len;

}

void split(char * fileName, long splitSize)

{

FILE *ifp,*ofp;

long FragSize;

long len;

long lLen = 0;

char *Buf = NULL;

char DestFile[1024];

char *i;

char *str = NULL;

int iSize  = 0;

int l = 0;

long cur = 0;

ifp = fopen( fileName,"rb" );

fseek(ifp,0L,SEEK_END);

iSize = ftell(ifp);

rewind(ifp);

FragSize = splitSize

<< 10;

str = (char *)malloc(FragSize + 1);

if(NULL ==  str)

{

printf( "内存分配失败!" );

}

do

{

l = l++;

sprintf(DestFile,"frag%04d",l);

ofp = fopen( DestFile,"wb" );

if ( NULL == ofp )

{

fclose( ifp );

printf( "不能创建分割文件!\n" );

return;

}

if(iSize > FragSize)

{

fseek(ifp, cur, SEEK_SET);

fread(str,FragSize,1,ifp);

str[FragSize] = '\0';

i = char_catch(str);

if(i)

{

len = i - str;

if (0 == len)

{

len = domore(ifp, ofp, FragSize, cur);

if (0 == len)

{

if(iSize > FragSize )

{

fseek(ifp,cur,SEEK_SET);

rwfile(ifp, ofp, FragSize);

iSize -= FragSize;

}

else

{

break;

}

}

}

else

{

fseek(ifp, cur, SEEK_SET);

rwfile(ifp, ofp, len);

}

iSize -= len;

cur +=

len;

}

else

{

len = domore(ifp, ofp,  FragSize, cur);

if (0 == len)

{

if(iSize > FragSize )

{

fseek(ifp,cur,SEEK_SET);

rwfile(ifp, ofp, FragSize);

iSize -= FragSize;

}

else

{

break;

}

}

iSize -= len;

cur += len;

}

}

else

{

FragSize = iSize;

rwfile(ifp, ofp, FragSize);

iSize = 0;

}

}

while(iSize > 0);

free(str);

fclose(ifp);

}

int main(int arg, char * arv[])

{

long

splitSize = 0;

printf( "按KB分割文件: " );

scanf( "%D", &splitSize

);

split("f.txt",splitSize);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值