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