/* |
* 把一个大文件文件拆分成指定的大小的几个小文件 |
* Author: Daniel Chen |
* yihua.chen@hotmail.com |
*/ |
#include <stdlib.h> |
#include <stdio.h> |
#define MAXFILECNT 8 |
static int filecount = 0; |
static char *Files[MAXFILECNT]; |
static char txtBuff[1024 * 520]; |
static char fname[256]; |
static int flength = 512; |
int getContent( FILE *file, char *buff, int offset, int length, int *flag) { |
char *tmp = &buff[offset]; |
int c = 0; |
int i = 0; |
*flag = 0; |
while ((c = fgetc (file)) > 0 && i < length) { |
tmp[i++] = ( char )c; |
} |
while (c > 0 && c != '\n' ) { |
tmp[i++] = ( char )c; |
c = fgetc (file); |
} |
if (c <= 0) { |
fclose (file); |
*flag = 1; |
} |
tmp[i] = '\0' ; |
return (i + offset); |
} |
void divide( char **files, int filecnt, const char *filename, const char *type, int divLen) { |
int i = 0; |
int j = 0; |
int len = 0; |
int flag = 0; |
int offset = 0; |
FILE *sf, *tf; |
if (filecnt <= 0) |
return ; |
sf = NULL; |
while (1) { |
if (sf == NULL) |
sf = fopen (files[i], "r" ); |
if (sf == NULL) { |
printf ( "Error: Open file %s failed!\n" , files[i]); |
exit (1); |
} |
len = getContent(sf, txtBuff, offset, divLen - offset, &flag); |
if (flag) { /* 当前文件已经读完 */ |
if (i >= filecnt - 1) { /* 没有新的文件可读取 */ |
sprintf (fname, "%s_%03d.%s" , filename, j++, type); |
tf = fopen (fname, "w+" ); |
if (tf == NULL) { |
printf ( "Create and open file %s failed!\n" , fname); |
exit (1); |
} |
fputs (txtBuff, tf); |
fflush (tf); |
fclose (tf); |
return ; /* 函数退出 */ |
} else { /* 还有新的文件可读取 */ |
if (len >= divLen) { /* 本次读取已经完成 */ |
sprintf (fname, "%s_%03d.%s" , filename, j++, type); |
tf = fopen (fname, "w+" ); |
if (tf == NULL) { |
printf ( "Create and open file %s failed!\n" , fname); |
exit (1); |
} |
fputs (txtBuff, tf); |
fflush (tf); |
fclose (tf); |
i++; |
offset = 0; |
sf = NULL; |
continue ; /* 继续读取下一个文件 */ |
} else { /* 本次读取尚未完成 */ |
i++; |
sf = NULL; /* 读取下一个文件 */ |
continue ; |
} |
} |
} else { /* 当前文件还没有读取完成 */ |
if (len < divLen) { /* 如果读取的长度不够,则出错 */ |
printf ( "Error: Read file %s error!\n" , files[i]); |
exit (1); |
} |
/* 将本次读取的内容写入新的文件 */ |
sprintf (fname, "%s_%03d.%s" , filename, j++, type); |
tf = fopen (fname, "w+" ); |
if (tf == NULL) { |
printf ( "Create and open file %s failed!\n" , fname); |
exit (1); |
} |
fputs (txtBuff, tf); |
fflush (tf); |
fclose (tf); |
/* 继续读取下一部分内容 */ |
offset = 0; |
continue ; |
} |
} |
return ; |
} |
int main( int argc, char **argv) { |
int i; |
if (argc <= 4) { |
printf ( "Usage: %s target_file_name target_file_type divide_len file1 [file2 ...]\n" , argv[0]); |
system ( "pause" ); |
return EXIT_SUCCESS; |
} |
filecount = argc - 4; |
if (filecount > MAXFILECNT) { |
printf ( "Open too many files!\n" ); |
return EXIT_FAILURE; |
} |
flength = atoi (argv[3]) * 1024; |
for (i = 0; i < filecount; i++) |
Files[i] = argv[4 + i]; |
divide(Files, filecount, argv[1], argv[2], flength); |
return EXIT_SUCCESS; |
} |