i社区用户: 密码:
搜索:
首页| 资讯| 信息化| 产品| 专题| 创业| 技术天地| 企业中心| 企业论坛| 职场| 周报全文| 商城| 市场
会展| Blog| i社区| 社区联盟| RSS| 电子杂志| 发行| 直播| IT两会| i| 下载| 上网导航| CIO俱乐部

“绿色”打印程序



胡东业 江苏省淮阴市运输管理处(223001)
胡东业 江苏省淮阴市运输管理处(223001)
我们要打印很长的文件,诸如程序清单、说明手册等,有时多达上百页。
用现有的打印程序,只能利用打印纸的某一面,另一面通常是浪费掉了,这是
因为程序不能把文件内容连贯地打印在纸张的正反面。也就是说,虽然可以打
印在反面,但正反面的内容却互不相关,毫无联系。因此,这种打印方法很难
充分利用纸的反面。
下述的C语言程序即可解决上述问题。它可以把任意大小的文本文件输出
在打印纸的正反两面,同时有行号、页号及标题等。
使用方法:
1.打印输出 C>GPRN〈页面〉〈起页〉〈止页〉〈文件名〉〉P
RN
2.显示输出C>GPRN〈页面〉〈起页〉〈止页〉〈文件名〉
参数说明:1.页面:q或Q:连续输出全部内容,不分反正面;
z或Z:只输出正面,即奇数页;
f或F:只输出反面,即偶数页;
2.起页:输出的开始页数;
3.止页:输出的结束页数;
4.文件名:要输出的文件名称,个数不限,支持文件名通配符,从命令
行的第4个参数起视为文件名。
1.在输出完某一页面后尚未输出另一页面之前,最好不要在当前目录中
增删文件,以免引起文件输出顺序的变化。例如:C>GPRN z 2 1
0 *.TXT表示输出当前目录中所有后缀名为TXT的文件,且只输出第
2至10页之间的奇数页。这时当前目录中有:A.TXT,S.TXT,K
.TXT,打印完正面之后,建立了一个新文件XYZ.TXT.此时文件的
排列顺序是:A.TXT,XYZ.TXT,S.TXT,K.TXT。这样
,再用C>GPRN f 2 10 *.TXT打印出来的内容与正面的就
不匹配了。如果在命令行不使用文件名通配符,则不必有此顾虑。
2.参数止页可给一个超过实际大小的假设数。
3.本程序用Borland C++ 3.0(称简BC3)编写,B
C3本身不能直接处理命令行文件通配符,用如下命令即可使BC3具有直接
处理命令通配符的能力:
C>TLIB CS_SETARGV+WILDARGS
C>TLIB CC_SETARGV+WILDARGS
C>TLIB CM_SETARGV+WILDARGS
C>TLIB CL_SETARGV+WILDARGS
C>TILB CH_SETARGV+WILDARGS
文件WILDARGS.OBJ在BC3软件包的LIB子目录中,可用
于支持BC3对文件通配符的处理。程序已在COMPAQ 486/33M
,MS-DOS 6.0环境下运行通过。
注意事项:
/*“绿色”打印程序〈GPRN.CPP〉*/
*****
#include
#include
#include
const int pgln=56;/*每页输出的行数*/
void main(int argc,char*argv[])
{ FILE *fp;
char ch,*endptr;
int file_no=4,eject=0,p_titl=1,prn_pg_mark=0;
unsigned long t_line=1,sta_page, end_page,now_page=1,prn_line=0;
if (argc<5) /*至少要有4个参数 */
{ printf("\n 用法:C>GPRN <页面> <起页> <止页> <文件名>\7\n");
exit(1);
}
/* 判断页面参数是否是正确*/
if (strcmp(argv[1],"q")!=0&&strcmp(argv[1],"Q")!=0&&
strcmp(argv[1],"z")!=0&&strcmp(argv[1],"Z")!=0&&
strcmp(argv[1],"f")!=0&&strcmp(argv[1],"F")!=0)
{printf("\n错误!页面参数应为下列之一:q,z,f,Q,Z,F\7\n");
exit(2);
}
/* 转换并判断起止页是否符合逻辑* /
sta_page=strtoul(argv[2],&endptr,10);
end_page=strtoul(argv[3],&endptr,10);
if (sta_page<1||end_page<1||sta_page>end_page)
{printf("错误!起止页参数要符合如下要求:");
printf("起页>0,止页>0,止页>=起页\7\n");
exit(3);
}
for (file_no=4;file_no { fp=fopen(argv[file_no],"rb");
if (fp==NULL) printf("\7\7\7");/* 如文件打不开,响铃 */
else
{ while ((ch=getc(fp))!=EOF)
{ /* 判断以何种页面输出及是否应该输出 */
if(((strcmp(argv[1],"q")==0||strcmp(argv[1],"Q")==0)||
((now_page/2*2==now_page)&&(strcmp(argv[1],"f")==0||
strcmp(argv[1],"F")==0))||((now-page/2*2!=now_page)&&
(strcmp(argv[1],"z")==0||strcmp(argv[1],"Z")==0)))&&
(now_page>=sta_page)&&(now-page<=end-page))
{ if(p_titl==1)
{ printf("\n\n=======No.%d=====Name:%s=======\n", file_no-3,argv[file-no]);
printf("%7ld",(now_page21)*pgln+1);
p_titl=0;
}
printf("%c",ch);
}
if (ch=='\n')/* 判断是否是回车符 */
{ t_line++;
eject++;
if (eject==pgln) /* 判断是否满一页 */
{ p_titl=1;
eject=0;
if (((strcmp(argv[1],"q"==0||strcmp(argv[1],"Q")==0)||
((now_page/2*2==now_page)&&(strcmp(argv[1],"f")==0||
strcmp(argv[1],"F")==0))||((now-page/2*2!=now_page)&&
(strcmp(arg[1],"z")==0||strcmp(argv[1],"Z")==0)))&&
(now_page>=sta_page)&&(now_page<=end_page))
{ /*\f 位灰撤* */
printf("=======Page%ld=======\f",now_page);
prn_pg_mark=1;
}
now_page++;
}
if (((strcmp(argv[1],"q")==0||strcmp(argv[1],"Q"==0)||
((now_page/2*2==now_page)&&(strcmp(argv[1],"f")==0||
strcmp(argv[1],"F")==0))||((now_page/2*2!=now_page)&&
(strcmp(argv[1],"z")==0||strcmp(argv[1],"Z")==0)))&&
(now_page>=sta_page)&&(now_page<=end_page)&&eject!=0)
{printf("%7ld",t_line);
prn_line=t_line;
prn_pg_mark=0;
}
}/* ch=='\n'*/
if (now_page>end_page) */ 如当前页大于止页,程序终止执行 */
{ fclose(fp);
exit(0);
}
}/* while */
fclose(fp);
}/* else */
}/* for */
if ((prn_pg_mark==0)&&(prn_line>=prn_line/pgln*pgln)&&prn_line>0)
printf("\n=======Page%ld=======\n",now-page);
} /* END MAIN() */
/* END GPRN.CPP 940902(P) */
*****

(计算机世界报 1994年 第46期)



周报全文频道联系方式:010-68130909
【关于我们】  【广告服务】  【周报发行】  【投稿指南】  【投稿声明】  【联系方式】  【法律声明】
  【媒体手册】  【编读往来】  
Copyright© ccw.com.cn,All rights reserved
中国计算机世界出版服务公司版权所有