C语言-编程实例-分割文档程式
2008-02-23 05:26:09来源:互联网 阅读 ()
/*** 文档分割 ***/
/***
运行程式时,假如编绎成的可执行文档名为fdiv.exe
则
若按字节数分割,命令行例如 " fdiv d:\dire\file.nnn 2.5k "
若按块数分割, 命令行例如 " fdiv d:\dire\file.nnn (25) "
分割结果:
例如 把file.nnn 分成 5 块 结果为file#nnn.001 --> file#nnn.005
! 注意:每次分割不得超过 999 块。而且假如超过 31 块,将不生成批拷贝文档
! 被分割的文档的文档名假如超过 4 个字符, 最好把他改为 <=4 (不算扩展名)
因为 DOS 下文档名只识别前 8 个字符,如 file --> file#nnn
***/
#define BYTE 0
#define PIECE 1 /*** 定义分割类型标识 ***/
#include<sio.h>
main(int argc,char **argv)
{
void fun (char *s); /*** 扩展名自加函数 ***/
FILE *fp_write,*fp_read,*fp_bat;
long num_in=0,byte_piece,pc_byte,total_byte;
int i,buffer=0,len,pc_fn=0,pc_float=0,byte_rest=0,sort_div;
char *fn_in,fn_out[50],p[]=".000",fn_bat[50],fn_obj_bat[12],s_rest_byte[3],s_pc_fn[3],ch;
switch (argc) /*** 命令行检测 ***/
{
case 3 : break;
case 2 :
printf ("\n ERROR! you forgot to enter the number\n"); exit (0);
case 1 :
printf ("\n ERROR! you forgot to enter the file name and the number\n");
exit (0);
}
fn_in=argv[1];
if ((fp_read=fopen(fn_in,"rb"))==NULL) /*** 打开被分割的文档 ***/
{ printf ("\n ERROR! the file not exists\n"); exit (0); }
fseek (fp_read,0L,2); total_byte=ftell (fp_read); rewind (fp_read);
if (*argv[2]=='\(') /*** 检测分割类型 ***/
{
sort_div=PIECE;
i=1;
while (argv[2][i]>='0'&&argv[2][i]<='9')
num_in=num_in*10 argv[2][i ]-'0'; /*** n 为输入的块数 ***/
if (argv[2][i]!='\)'&&argv[2][i])
{ printf ("\n ERROR! the entered NUMBER is invalid\n"); exit (0); }
if (num_in>999)
{ printf ("\n ERROR! can not creat more than 999 files\n"); exit (0); }
byte_rest=total_byte%num_in; byte_piece=total_byte/num_in; if (byte_rest>0) byte_piece ;
}
else
{
sort_div=BYTE;
i=0;
while (argv[2][i]>='0'&&argv[2][i]<='9') { num_in=num_in*10 argv[2][i]-'0'; i ; }
if (argv[2][i]=='.')
{
i ; while (argv[2][i]>='0'&&argv[2][i]<='9') { num_in=num_in*10 argv[2][i]-'0'; i ; pc_float ; }
}
ch=argv[2][i];
if (ch=='K'||ch=='k') num_in*=1024; if (ch=='M'||ch=='m') num_in=num_in*1024*1024;
if (ch&&ch!='.'&&ch!='k'&&ch!='K'&&ch!='m'&&ch!='M')
{ printf ("\n ERROR! the entered NUMBER is invalid\n"); exit (0); }
for (i=1;i<=pc_float;i ) num_in=num_in/10;
byte_piece=num_in;
if (total_byte%byte_piece==0) pc_fn=total_byte/byte_piece; else pc_fn=total_byte/byte_piece 1;
if (pc_fn>999)
{ printf ("\n ERROR! can not creat more than 999 files\n"); exit (0); }
}
i=0; /*** d:\dire\file.nnn --->d:\dire\file#nnn ***/
while (*(fn_in i))
{
if (*(fn_in i)!='.') *(fn_out i)=*(fn_in i); else *(fn_out i)='#'; i ;
}
*(fn_out i)='\0';
scpy (fn_bat,fn_out); scpy(fn_obj_bat,fn_out); scat (fn_bat,".bat");
/*** d:\dire\file#nnn --> d:\dire\file#nnn.bat ***/
scat (fn_out,p); len=slen (fn_out);
/*** d:\dire\file#nnn --->dire#nnn.000 ***/
/*** 分割 ***/
fread (&buffer,1,1,fp_read); pc_fn=0;
while (!feof(fp_read))
{
fun (fn_out len-3); /*** 调用扩展名自加函数 ***/
fp_write=fopen(fn_out,"wb");
pc_byte=0;
while (!feof(fp_read))
{
fwrite (&buffer,1,1,fp_write); pc_byte; fread (&buffer,1,1,fp_read);
if (pc_byte==byte_piece) { fclose (fp_write); break; }
}
pc_fn ;
if (sort_div==PIECE) if (pc_fn==byte_rest) byte_piece--;
/*** 若按块分割,前 byte_rest 个块文档均比后面的块文档多 1 个字节 ***/
}
fclose (fp_read); fclose (fp_write);
/**** 生成拷贝文档 ***/
if (pc_fn<=31)
{
fp_bat=fopen(fn_bat,"w"); fputs ("copy /b ",fp_bat);
len=slen (fn_obj_bat);
while (fn_obj_bat[len-1]!='\\'&&len-1>=0) len--; i=0;
while (fn_obj_bat[len i]) { fn_obj_bat[i]=fn_obj_bat[len i]; i ; } fn_obj_bat[i]='\0';
/*** 分离出目标文档名,(取出 fn_in 的关键词) ***/
scat (fn_obj_bat,".000");
len=slen(fn_obj_bat);
for (i=1;i<=pc_fn;i )
{
fun (fn_obj_bat len-3); /*** 调用扩展名自加函数 ***/
if (i>1) fputs (" ",fp_bat);
fputs (fn_obj_bat,fp_bat);
}
len=slen (fn_in);
while (fn_in[len-1]!='\\'&am
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C语言高效编程的的四招技巧
下一篇: C语言-编程实例-合并文档程式
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash